【发布时间】:2020-12-30 23:05:07
【问题描述】:
所以我是 PL/SQL 的新手,我想创建一个触发器,其中不能更新或删除特定记录的薪水,而表的其他记录可以。假设我不想更新或删除其薪水的记录是EMPNO = 7839,触发器被创建,但是当我更新 EMP 表中的任何记录时,它给了我ORA-04091: table SCOTT.EMP is mutating, trigger/function may not see it 的错误,有人可以给我一个解决方案吗?
这是代码:
CREATE OR REPLACE TRIGGER PRACTICE_TRIGGER
BEFORE DELETE OR UPDATE OF SAL ON EMP
FOR EACH ROW
DECLARE
ROW_NUM NUMBER;
BEGIN
SELECT COUNT(*) INTO ROW_NUM FROM EMP WHERE EMPNO = 7839;
IF UPDATING('ROW_NUM') THEN
RAISE_APPLICATION_ERROR('-20000','CANT UPDATE/DELETE SALARY OF EMPNO = 7839');
END IF;
END PRACTICE_TRIGGER;
/
【问题讨论】:
-
除了技术问题,还有什么商业案例?为什么我们要阻止一位特定员工的薪水变动?如果规则扩展到或更改到其他员工怎么办?你不想总是重新编译触发器来处理这样的变化。
-
另外,你是说不只删除工资值,还是不删除整条记录?
-
@pmdba 我说的是不删除工资值。
-
@BHS 然后你的触发器不需要触发“删除或更新”,只需更新。删除是针对被删除的整个记录。更新用于更改列的值。