【发布时间】:2019-08-31 12:48:27
【问题描述】:
您好,我正在大学学习触发器,我正在尝试实现一个简单的函数来理解逻辑。我正在尝试创建一个触发器,禁止员工同时拥有 4 个以上的项目。 全部编译正确,但是当我通过向员工添加第 5 个项目来测试触发器时,触发器不会检测到它。谁能用我的逻辑解释我做错了什么。
CREATE OR REPLACE TRIGGER MAXPROJECTS
BEFORE INSERT OR UPDATE
ON WorksOn FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
project_count INT(10);
BEGIN
SELECT COUNT(p#) INTO project_count
FROM WorksOn WHERE e# =:NEW.e#;
IF (project_count > 4)
THEN RAISE_APPLICATION_ERROR(-20010,
'employee is already working on 4
projects.');
END IF;
END;
/
【问题讨论】:
-
因为
AUTONOMOUS_TRANSACTION杂注。您的触发器(选择语句)只看到提交的数据。如果每个INSERT或UPDATE语句是一个单独的事务(您需要在每个INSERT或UPDATE语句之后提交)并且 IF 条件从project_count > N到project_count > N - 1。但我建议不要在触发器中实现这个逻辑。而是在存储过程 (API) 中实现它 -
PRAGMA AUTONOMOUS_TRANSACTION = 在这里开始错误。
-
顺便说一下,这种业务规则是出了名的难以实施,触发器可能不是正确的方法。一方面,如果同一员工同时在五个单独的会议中分配到五个项目怎么办?触发器只看到其他会话的提交数据。
标签: sql oracle plsql database-trigger