【问题标题】:Trigger for audit table审计表触发器
【发布时间】:2014-04-19 22:53:28
【问题描述】:

我正在尝试运行此代码为我的审计表创建触发器,但我收到错误消息:

PLS-00103: Encountered the symbol "TRG_AUDIT_EMP" when expecting one of the following: if

我该如何解决这个问题?

create or replace TRIGGER trg_audit_emp
  AFTER INSERT OR DELETE OR UPDATE ON emp_mb
  FOR EACH ROW
DECLARE
  v_trg_action VARCHAR2(6);
BEGIN
  IF updating
  THEN
    v_trg_action := 'UPDATE';
  ELSE IF deleting
  THEN
    v_trg_action := 'DELETE';
  ELSE IF inserting
  THEN
    v_trg_action := 'INSERT';
  ELSE
    v_trg_action := 'NULL';
END IF;
  IF v_trg_action IN ('DELETE','UPDATE') THEN
   INSERT INTO emp_audit
  ( emp_id,  emp_forename,  emp_surname, username, AUDIT_USER,  AUDIT_DATE,  AUDIT_ACTION)
   VALUES
  (:OLD.emp_ID, :OLD.emp_forename, :OLD.emp_surname, :old.username, UPPER(v('APP_USER')), SYSDATE, v_trg_action);
  ELSE
   INSERT INTO emp_audit
  ( emp_id,  emp_forename,  emp_surname, username, AUDIT_USER,  AUDIT_DATE,  AUDIT_ACTION)
   VALUES
  (:NEW.emp_id, :NEW.emp_forename, :NEW.emp_surname, NEW.username, UPPER(v('APP_USER')), SYSDATE, v_trg_action);
  END IF;
END trg_audit_emp ;​

【问题讨论】:

    标签: sql plsql triggers


    【解决方案1】:

    只需删除END 语法后的trg_audit_emp !你还需要结束你的ELSE IF 示例:

           create or replace TRIGGER trg_audit_emp
          AFTER INSERT OR DELETE OR UPDATE ON emp_mb
          FOR EACH ROW
        DECLARE
          v_trg_action VARCHAR2(6);
        BEGIN
          IF updating
          THEN
            v_trg_action := 'UPDATE';
          ELSE IF deleting
          THEN
            v_trg_action := 'DELETE';
          ELSE IF inserting
          THEN
            v_trg_action := 'INSERT';
          ELSE
            v_trg_action := 'NULL';
        END IF;
        END IF;
        END IF;
          IF v_trg_action IN ('DELETE','UPDATE') THEN
           INSERT INTO emp_audit
          ( emp_id,  emp_forename,  emp_surname, username, AUDIT_USER,  AUDIT_DATE,  AUDIT_ACTION)
           VALUES
          (:OLD.emp_ID, :OLD.emp_forename, :OLD.emp_surname, :old.username, UPPER(v('APP_USER')), SYSDATE, v_trg_action);
          ELSE
           INSERT INTO emp_audit
          ( emp_id,  emp_forename,  emp_surname, username, AUDIT_USER,  AUDIT_DATE,  AUDIT_ACTION)
           VALUES
          (:NEW.emp_id, :NEW.emp_forename, :NEW.emp_surname, NEW.username, UPPER(v('APP_USER')), SYSDATE, v_trg_action);
          END IF;
        END;
    /
    

    【讨论】:

    • 为响应干杯,但我收到此错误。第 24 行错误:PL/SQL: SQL 语句被忽略
    • 你是什么 24 行?
    【解决方案2】:

    在 PL/SQL 中,IF 语句的语法是

    IF condition THEN
      statement
    ELSIF condition THEN
      statement
    ELSE
      statement
    END;
    

    你有ELSE IF而不是ELSIF,然后END IFs太多了。

    试试这个:

    create or replace TRIGGER trg_audit_emp
      AFTER INSERT OR DELETE OR UPDATE ON emp_mb
      FOR EACH ROW
    DECLARE
      v_trg_action VARCHAR2(6);
    BEGIN
      IF updating THEN
        v_trg_action := 'UPDATE';
      ELSIF deleting THEN
        v_trg_action := 'DELETE';
      ELSIF inserting THEN
        v_trg_action := 'INSERT';
      ELSE
        v_trg_action := 'NULL';
      END IF;
    
      IF v_trg_action IN ('DELETE','UPDATE') THEN
        INSERT INTO emp_audit (emp_id, emp_forename, emp_surname,username,
                               AUDIT_USER, AUDIT_DATE, AUDIT_ACTION)
        VALUES (:OLD.emp_ID, :OLD.emp_forename, :OLD.emp_surname, :old.username, 
                UPPER(v('APP_USER')), SYSDATE, v_trg_action);
      ELSE
        INSERT INTO emp_audit (emp_id,  emp_forename,  emp_surname, username,
                               AUDIT_USER,  AUDIT_DATE,  AUDIT_ACTION)
        VALUES (:NEW.emp_id, :NEW.emp_forename, :NEW.emp_surname, NEW.username, 
                UPPER(v('APP_USER')), SYSDATE, v_trg_action);
      END IF;
    END trg_audit_emp;​
    

    分享和享受。

    【讨论】:

      猜你喜欢
      • 2021-06-05
      • 1970-01-01
      • 2021-09-05
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2017-12-09
      相关资源
      最近更新 更多