oracle - 如何正确地将表中的值与触发器进行比较?(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';
结果是 15-SEP-18。现在让我们尝试在开始日期之前插入预算,例如 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
希望能帮助到你!
推荐阅读
- mysql - 计算两个日期之间 mysql 表中的记录,如果行为空,则返回零
- javascript - JS / Clojure(或任何)代码用于将极坐标转换为(切线?)正确矩形上的笛卡尔坐标?
- c++ - 除了使用 set 之外,是否可以为 CMake SOURCE(S) 设置值?
- java - MS 最新版本的 JDBC 驱动程序正在使用(已弃用)ADAL 库。MSAL 的计划是什么?
- angular - 值更改时处理禁用/启用表单
- javascript - Vue.js - 在计算中使用本地方法是不好的做法吗?
- docker - ROS的Docker镜像无法使用?
- azure - 从 Postman 调用时,使用 Azure Active Directory 中的证书进行签名并返回访问令牌
- java - 将@ManyToMany 关系映射到 JPA 和 Hibernate 的最有效方法是什么?
- matplotlib - xticks 标签不会显示在 Julia Plots 中(使用 pyplot 后端)