【发布时间】:2015-06-04 21:25:37
【问题描述】:
我想编写一个触发器来阻止从表中删除记录并阻止在更新时降低工资。它可以作为两个单独的触发器很好地工作,但我想将它合并为一个。
这是我合并后的触发器:
CREATE OR REPLACE TRIGGER test
BEFORE DELETE OR UPDATE
ON emp
FOR EACH ROW
BEGIN
IF UPDATING THEN
IF :NEW.sal < :OLD.sal THEN
raise_application_error(-20500, 'You cannot decrease emp salary');
END IF;
ELSE DELETING THEN
raise_application_error(-20500, 'You cannot delete records from emp');
END IF;
END;
问题是当我尝试更新或删除记录时出现错误:
04098. 00000 - "trigger '%s.%s' is invalid and failed re-validation"
*Cause: A trigger was attempted to be retrieved for execution and was
found to be invalid. This also means that compilation/authorization
failed for the trigger
我认为这行有问题 - BEFORE DELETE OR UPDATE 因为我知道如果我 FOR EACH ROW 声明我应该写为 BEFORE UPDATE on sal,但是我不知道如何加入 BEFORE DELETE 声明进入这个。
编辑:
问题出在ELSE 声明附近。应该改成ELSIF
【问题讨论】:
-
请尝试将
else替换为elsif(或删除deleting then)。 -
你是 100% 正确的,我完全错过了。
-
我会做任何事情来让你的触发器工作,因为它禁止减薪。 ;-)