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;