SQL Trigger不适用于Audit

时间:2018-05-30 11:06:14

标签: oracle plsql database-trigger ora-00984

要求: 对表OPS_BUILD_ACTIVITY_LABEL中的列值进行任何更新后,我们必须在ACTIVITY_LABEL_AUDIT_LOG表格中插入一行,其中列为TABLE_NAME, COLUMN_NAME, OLD_VALUE, NEW_VALUE, UPDATED_BY, UPDATED_DTM

我创建了Trigger,如下所示。使用以下编译错误创建的触发器:

PL/SQL: SQL Statement ignored
PL/SQL: ORA-00984: column not allowed here

请帮我解决这个问题。

create or replace TRIGGER ACTIVITY_LABEL_TRIGGER
AFTER UPDATE OF ACTIVITY_LABEL, NOTES
ON OPS_BUILD_ACTIVITY_LABEL
FOR EACH ROW
BEGIN
  INSERT INTO ACTIVITY_LABEL_AUDIT_LOG
   ( TABLE_NAME,
     COLUMN_NAME,
     OLD_VALUE,
     NEW_VALUE,
     UPDATED_BY,
     UPDATED_DTM)   
     VALUES   

   ('OPS_BUILD_ACTIVITY_LABEL',
    'ACTIVITY_LABEL',
    OLD.ACTIVITY_LABEL,
    NEW.ACTIVITY_LABEL,
    NEW.LAST_UPDATED_BY,
    NEW.LAST_UPDATED_DTM); 

END;

2 个答案:

答案 0 :(得分:0)

使用冒号(:)添加OLD和NEW前缀,如下所示( ORA-00984 因为这个而加注,顺便说一下我假设没有问题列名称:

CREATE OR REPLACE TRIGGER ACTIVITY_LABEL_TRIGGER
AFTER ON OPS_BUILD_ACTIVITY_LABEL
FOR EACH ROW
BEGIN
 if ( nvl(:OLD.ACTIVITY_LABEL,'xYz#@!') != nvl(:NEW.ACTIVITY_LABEL,'xYz#@!')
   or nvl(:OLD.NOTES,'xYz#@!') != nvl(:NEW.NOTES,'xYz#@!') ) then
  INSERT INTO ACTIVITY_LABEL_AUDIT_LOG
    (TABLE_NAME,
     COLUMN_NAME,
     OLD_VALUE,
     NEW_VALUE,
     UPDATED_BY,
     UPDATED_DTM)
  VALUES  
    ('OPS_BUILD_ACTIVITY_LABEL',
     'ACTIVITY_LABEL',
     :OLD.ACTIVITY_LABEL,
     :NEW.ACTIVITY_LABEL,
     :NEW.LAST_UPDATED_BY,
     :NEW.LAST_UPDATED_DTM);
 end if;
END;

关于您的评论,我删除了部分UPDATE OF ACTIVITY_LABEL, NOTES并对 IF语句中的两列ACTIVITY_LABELNOTES进行了比较。如果您想获取每个更新操作的每个日志,您还应该删除 IF语句

答案 1 :(得分:0)

感谢您的所有答案,根据您的答案,我最终通过以下代码达到了要求:

{{1}}