如何正确比较带有触发器的表之间的值? (PL-SQL)

时间:2019-05-02 23:44:49

标签: oracle plsql database-trigger

我目前无法在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-SEP-18。现在,让我们尝试在开始日期之前插入预算,例如13-SEP-18。

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

运行这两个命令后,结果为:

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

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

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

1 个答案:

答案 0 :(得分:0)

也许我想念一些东西,但是对我来说似乎很简单。您的触发器仅在更新之前运行,您还应该添加BEFORE INSERT。检查以下模式:

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

希望有帮助!