【问题标题】::new and :old values dynamically in oracle Trigger:new 和 :old 值在 oracle 触发器中动态变化
【发布时间】:2020-11-10 18:22:39
【问题描述】:

我必须在单个审计表 test_audit 中跟踪数据更改,该表可用于其他触发器来跟踪更改。我已经尝试过这段代码,但一直在填充新旧值。 非常感谢您对此提供任何帮助。

create table test (ID NUMBER , ENAME VARCHAR2(10) , LOCATION VARCHAR2(10));

 create or replace trigger my_trigger
    after update on TEST
    for each row
    declare
       ACTION VARCHAR2(10);
     begin
    
    IF DELETING THEN
          ACTION := 'DELETE';
        ELSIF UPDATING THEN
          ACTION := 'UPDATE';
        END IF;
                 
       for i in (select column_name,table_name from all_tab_columns
                 where table_name = 'TEST'
                 )
       loop
         if updating(i.column_name) then
          INSERT
          INTO TEST_AUDIT
            (
                TABLE_NAME,
                COLUMN_NAME,
                OLD_VALUE,
                NEW_VALUE,
                ACTION,
                UPDATED_BY,
                UPDATED_DT
                        )
            VALUES
            (   
                i.table_name,
                i.column_name,
             --   :old.column_name,--- how to get old and new values?
              --  :new.column_name,---
                ACTION,         
               USER,
               SYSDATE
            );
       end if;
       end loop;
       
    end;

【问题讨论】:

标签: oracle plsql oracle12c database-trigger


【解决方案1】:

名为 :new 和 :old 的变量(除非您决定在触发器的声明中重命名它们)是您放置触发器的表的行类型的变量。所以你使用 :new. 和 :old..

【讨论】:

  • 这正是他们所说的。但是你为什么要发展自己的审计呢?这是一个比简单地将新旧值写入表更复杂和复杂的主题方式这就是为什么让 DBMS 为您做这件事的原因,请参阅Traditional Auditing 和/或Unified Auditing 或只是谷歌“Oracle 审计”
  • 是的。您必须在那里对列名进行硬编码,因为 PL/SQL 是一种编译语言。你不能动态地做到这一点。更准确地说:您可以使用动态。 sql 但性能损失是巨大的,所以一般来说你不希望这样。
  • 如果您确实想“玩世不恭”地做事,最好的选择是编写一个 PL/SQL 包,该包将查看元数据字典以自动生成触发器的来源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2013-11-05
  • 1970-01-01
  • 2018-12-19
  • 2021-10-07
  • 1970-01-01
  • 2018-11-30
相关资源
最近更新 更多