Oracle 04098. &引用;触发器';%s、 %s';无效且重新验证失败”;
我想写一个触发器,阻止从表中删除记录,并阻止更新时降低工资。它可以作为两个独立的触发器工作,但我想将其合并为一个 以下是合并后的触发器:Oracle 04098. &引用;触发器';%s、 %s';无效且重新验证失败”;,oracle,plsql,Oracle,Plsql,我想写一个触发器,阻止从表中删除记录,并阻止更新时降低工资。它可以作为两个独立的触发器工作,但我想将其合并为一个 以下是合并后的触发器: 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_appl
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;
我认为这行有一个问题-在删除或更新之前,因为我知道如果我对于每一行
我应该写的语句是在sal更新之前,但是我不知道如何在删除之前加入
编辑:
问题出在ELSE
station附近。如果您的IF语句语法不正确,则应将其更改为ELSIF
。应该是:
CREATE OR REPLACE TRIGGER test
BEFORE DELETE OR UPDATE
ON emp
FOR EACH ROW
BEGIN
IF UPDATING AND :NEW.sal < :OLD.sal THEN
raise_application_error(-20500, 'You cannot decrease emp salary');
ELSIF DELETING THEN
raise_application_error(-20500, 'You cannot delete records from emp');
END IF;
END test;
创建或替换触发器测试
在删除或更新之前
论电磁脉冲
每行
开始
如果更新和:NEW.sal<:OLD.sal,则
加薪申请错误(-20500,“您不能降低emp工资”);
如果删除,则
引发应用程序错误(-20500,“您无法从emp中删除记录”);
如果结束;
结束试验;
我还将更新案例中使用的两个IF语句合并为一个,以使其更简单
编辑
如果您不想降低工资,另一种可能的解决方案是悄悄地将工资更改回其原始值,如:
CREATE OR REPLACE TRIGGER test
BEFORE DELETE OR UPDATE
ON emp
FOR EACH ROW
BEGIN
IF UPDATING AND :NEW.sal < :OLD.sal THEN
:NEW.sal := :OLD.sal; -- restore original salary
ELSIF DELETING THEN
raise_application_error(-20500, 'You cannot delete records from emp');
END IF;
END test;
创建或替换触发器测试
在删除或更新之前
论电磁脉冲
每行
开始
如果更新和:NEW.sal<:OLD.sal,则
:NEW.sal:=:OLD.sal;--恢复原有工资
如果删除,则
引发应用程序错误(-20500,“您无法从emp中删除记录”);
如果结束;
结束试验;
请尝试将else
替换为elsif
(或删除然后删除
)。你是100%对的,我完全错过了。我会尽一切努力让你的触发生效,因为它禁止减薪。;-)你是对的,但我发现在更新多个记录的情况下触发器不会工作。例如,如果我想为所有姓约翰逊的人更改sal,其中emp_name='Johnson',如果其中一人的新工资较低,触发器将阻止整个更新。我怎样才能避免这种情况?
CREATE OR REPLACE TRIGGER test
BEFORE DELETE OR UPDATE
ON emp
FOR EACH ROW
BEGIN
IF UPDATING AND :NEW.sal < :OLD.sal THEN
:NEW.sal := :OLD.sal; -- restore original salary
ELSIF DELETING THEN
raise_application_error(-20500, 'You cannot delete records from emp');
END IF;
END test;