如何使用触发器正确比较表中的值? (PL-SQL)

How do I correctly compare values across tables with triggers? (PL-SQL)

我目前无法在 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';              

结果是 2018 年 9 月 15 日。现在让我们尝试在开始日期之前插入预算,假设是 13-SEP-18。

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

在 运行 这两个命令之后,结果是:

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

如您所见,它似乎根本不起作用。项目 (8) 的预算被添加,就好像触发器根本不起作用一样。

如果有人能看到问题,请指出正确的方向,我将不胜感激。非常感谢您的阅读和时间。

也许我错过了什么,但对我来说似乎很简单。您的触发器仅在更新之前运行,您也应该添加 BEFORE INSERT。检查以下模式:

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

希望对您有所帮助!