如何使用触发器正确比较表中的值? (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
希望对您有所帮助!
我目前无法在 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
希望对您有所帮助!