我目前无法在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)的预算被添加,就好像触发器根本不起作用一样。
如果有人看到问题,请向我指出正确的方向,我将不胜感激。非常感谢您的阅读和时间。
答案 0 :(得分:0)
也许我想念一些东西,但是对我来说似乎很简单。您的触发器仅在更新之前运行,您还应该添加BEFORE INSERT。检查以下模式:
CREATE [ OR REPLACE ] TRIGGER trigger_name
BEFORE INSERT or UPDATE or DELETE
希望有帮助!