Создание триггера, чтобы не создавать страховой полис для водителя, попавшего в аварию - PullRequest
0 голосов
/ 15 апреля 2019

Здравствуйте, я новичок в триггерах в SQL и мне нужна помощь с одним из них. Я работаю с 3 таблицами, связанными с водителями, автомобильными авариями и страховым полисом. То, что я пытаюсь сделать, - это создать триггер, который не позволит создавать страховые полисы для водителей, попавших в аварию.

Вот что я пробовал до сих пор:

CREATE TABLE insurance_policy(
    id INT,
    ssn_driver INT,
    expiration_date DATE,
    PRIMARY KEY (id)
);

CREATE TABLE accident(
    id INT,
    ssn_driver INT,
    accident_date DATE,
    details VARCHAR2(64),
    PRIMARY KEY (id),
    FOREIGN KEY (id) REFERENCES insurance_policy,
    FOREIGN KEY (ssn_driver) REFERENCES driver
);

CREATE TABLE driver(
    ssn_driver INT,
    name VARCHAR2(64),
    age INT CHECK (age>15),
    PRIMARY KEY(ssn_driver)
);

CREATE TRIGGER no_insurance_policy
    AFTER INSERT OR UPDATE ON insurance_policy
    FOR EACH ROW 
    BEGIN 
        IF EXISTS (select ssn_driver FROM Inserted INNER JOIN accident)
        BEGIN
            rollback transaction
            raiserror ('some message', 16, 1)
        END
    END

Это не компилируется, но я просто не понимаю, как действовать дальше. Может кто-нибудь помочь мне с созданием этого триггера?

РЕДАКТИРОВАТЬ: Здесь ошибка

Error starting at line : 31 in command -
    BEGIN 
        IF EXISTS (select ssn_driver FROM Inserted INNER JOIN accident)
        BEGIN
            rollback transaction
            raiserror ('some message', 16, 1)
        END
    END
Error report -
ORA-06550: line 2, column 58:
PLS-00103: Encountered the symbol "JOIN" when expecting one of the following:

   ) , with group having intersect minus start union where
   connect
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

1 Ответ

3 голосов
/ 15 апреля 2019

Для начала нужно вставить BEFORE, а не AFTER. Тогда ваш синтаксис даже не Oracle. Вот примерно то, что вам нужно сделать. Я не проверял это.

CREATE TRIGGER no_insurance_policy
    BEFORE INSERT OR UPDATE ON insurance_policy
    FOR EACH ROW 
DECLARE
    v_accidentCout NUMBER(10);
BEGIN
    Select Count(*) Into v_accidentCout 
    From accident
    Where ssn_driver = old.ssn_driver;

    If v_accidentCout > 0 Then
        raise_application_error(-12345, 'Driver has accidents');
    End If;  
END;
/

Я бы оставил commit / rollback блоку, который вызывает insert / update.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...