Как правильно сравнить значения в таблицах с триггерами? (PL-SQL) - PullRequest
0 голосов
/ 03 мая 2019

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

У меня есть две соответствующие таблицы.

Проект: https://i.imgur.com/MC7yPZT.png

Бюджет: https://i.imgur.com/HGJ6oLy.png

Это мой триггер:

-- check legality of budget date
CREATE OR REPLACE TRIGGER trg_budget_date 
BEFORE UPDATE OF budget_date ON budget 
FOR EACH ROW
DECLARE var_project_start DATE;
BEGIN

    SELECT project.project_start
    INTO var_project_start
    FROM project
    WHERE project.project_id = :new.project_id;

    IF :new.budget_date > var_project_start THEN
        RAISE_APPLICATION_ERROR(-20000, 'Budget made before project start.');
    END IF;

END;
/

Чтобы продемонстрировать, как мой триггер не работает, я сначала объясню, как я его тестирую.

SELECT project_id, project_start
FROM project
WHERE project_id = '8';              

Результат 15 сентября. Теперь давайте попробуем вставить бюджет до даты начала, скажем, 13-СЕНТЯБРЯ-18.

INSERT INTO budget VALUES (8, 9000, '13-SEP-18', 4);

После выполнения этих двух команд, это результат:

https://i.imgur.com/cWjrIMv.png

Как видите, он вообще не работает. Бюджет проекта (8) добавляется так, как если бы триггер не работал вообще.

Если кто-то может увидеть проблему, направьте меня в правильном направлении, я был бы очень признателен. Большое спасибо за прочтение и ваше время.

1 Ответ

0 голосов
/ 03 мая 2019

Может быть, я что-то упускаю, но мне это кажется простым. Ваш триггер запускается только перед обновлением, вы должны также добавить ДО ВСТАВКИ. Проверьте следующий шаблон:

CREATE [ OR REPLACE ] TRIGGER trigger_name  
BEFORE INSERT or UPDATE or DELETE

Надеюсь, это поможет!

...