基本 Oracle 触发器审计表

Posted

技术标签:

【中文标题】基本 Oracle 触发器审计表【英文标题】:Basic Oracle Trigger audit table 【发布时间】:2013-11-16 15:15:35 【问题描述】:

我遇到了这个错误,不知道如何解决这个错误。所以请帮助我。

错误(8,11): PL/SQL: SQL 语句被忽略

错误(10,26):PL/SQL:ORA-00904:“NEWRETAILPRICE”:标识符无效

错误(17,8):PL/SQL:SQL 语句被忽略

错误(19,57):PL/SQL:ORA-00904:“NEWRETAILPRICE”:标识符无效

错误(25,6):PL/SQL:SQL 语句被忽略

错误(27,26):PL/SQL:ORA-00904:“OLDRETAILPRICE”:标识符无效

我的代码是

CREATE OR REPLACE TRIGGER product_audit
    BEFORE INSERT OR DELETE OR UPDATE ON DD_Products
    FOR EACH ROW
  DECLARE
       Var_ChangeType CHAR(1);

  BEGIN

    IF INSERTING THEN
          VAR_ChangeType := 'I';
          INSERT INTO DD_PriceChange
          (PriceChangeNo, Change_Type, ChangeBy, ChangeDate, 
         NewProductPrice,NewRetailPrice)
         VALUES (ProductHistory_SEQ.NEXTVAL, VAR_ChangeType, USER, SYSDATE,
            :NEW.ProductPrice,  :NEW.RetailPrice);

      ELSIF UPDATING THEN
      VAR_ChangeType := 'U';

       INSERT INTO DD_PriceChange
     (PriceChangeNo, Change_Type, ChangeBy, ChangeDate, 
         OldProductPrice,OldRetailPrice,NewProductPrice,NewRetailPrice)
   VALUES (ProductHistory_SEQ.NEXTVAL, VAR_ChangeType, USER, SYSDATE,
           :OLD.ProductPrice,  :OLD.RetailPrice,:NEW.ProductPrice,  :NEW.RetailPrice);

        ELSE
         VAR_ChangeType := 'D';
     INSERT INTO DD_PriceChange
    (PriceChangeNo, Change_Type, ChangeBy, ChangeDate, 
         OldProductPrice,OldRetailPrice)
   VALUES (ProductHistory_SEQ.NEXTVAL, VAR_ChangeType, USER, SYSDATE,
           :OLD.ProductPrice,  :OLD.RetailPrice);
    END IF;

  END; 
  /

我创建了一个这样的表

 Create table DD_PriceChange
 (
      PriceChangeNo NUMBER(5) PRIMARY KEY, 
      Change_Type CHAR(1), 
      ChangeBy VARCHAR2(20),
      ChangeDate DATE, 
      OldProductPrice NUMBER(5),
      NewProductPrice NUMBER(5),
      OldRetailPrice NUMBER(5),
      NewRetailPrice NUMBER(5)
 );

CREATE SEQUENCE ProductHistory_SEQ;

请问有谁知道我为什么会收到这个错误。

【问题讨论】:

【参考方案1】:

不知道您为什么会收到错误,但我剥离了所有内容并从基础重新构建触发器并使其正常工作:

CREATE OR REPLACE TRIGGER product_audit
  BEFORE INSERT OR DELETE OR UPDATE ON DD_Products
  FOR EACH ROW
DECLARE
  VAR_ChangeType CHAR(1);
BEGIN
  IF INSERTING   THEN VAR_ChangeType := 'I';
  ELSIF UPDATING THEN VAR_ChangeType := 'U';
  ELSE                VAR_ChangeType := 'D';
  END IF;
  INSERT INTO DD_PriceChange
  (
    PriceChangeNo,
    Change_Type,
    ChangeBy,
    ChangeDate, 
    NewProductPrice,
    NewRetailPrice, 
    OldProductPrice,
    OldRetailPrice
  ) VALUES (
    ProductHistory_SEQ.NEXTVAL,
    VAR_ChangeType,
    USER,
    SYSDATE,
    :NEW.ProductPrice,
    :NEW.RetailPrice,
    :OLD.ProductPrice,
    :OLD.RetailPrice
  );
END product_audit;
/

SQLFIDDLE

【讨论】:

以上是关于基本 Oracle 触发器审计表的主要内容,如果未能解决你的问题,请参考以下文章

特定表的 Oracle 11g 审计跟踪

从 oracle 中的触发器进行审计

创建一个监听多个表的全局触发器

在 Oracle 中审计 DML 更改

如何使用触发器将基表的所有更新列添加到审计表的多行?

重命名时的 Oracle 12C 审计触发器