【问题标题】:Triggers in Oracle and how to keep the records after a rollbackOracle 中的触发器以及回滚后如何保留记录
【发布时间】:2011-12-25 12:33:40
【问题描述】:

我需要创建一个在影子表中写入更改的触发器。我知道如何创建触发器,但我的挑战是即使在回滚后我也需要新表中的记录存在。

这是一个输出的例子

INSERT INTO department VALUES (95, 'PURCHASING', 'CHICAGO');<br>
ROLLBACK;

1 rows inserted.
rollback complete.

SELECT * FROM department_log;

DEPARTMENT_ID           DEPARTMENT_NAME       ADDRESS               OPERATION_TIME            
---------------------- -------------------- -------------------- ------------------ 
90                      HR                    CHICAGO               03-NOV-11
95                      PURCHASING            CHICAGO               03-NOV-11

SELECT * from department WHERE department_id >= 90;

DEPARTMENT_ID           DEPARTMENT_NAME       ADDRESS              
---------------------- -------------------- -------------------- 
90                      HR                    CHICAGO

【问题讨论】:

    标签: oracle triggers oracle10g


    【解决方案1】:

    您需要使用自治事务。

    SQL> create table t (col1 number);
    
    Table created.
    
    SQL> create table t_shadow( col1 number, dt date );
    
    Table created.
    
    SQL> create trigger trg_t
      2    before insert on t
      3    for each row
      4  declare
      5    pragma autonomous_transaction;
      6  begin
      7    insert into t_shadow( col1, dt )
      8      values( :new.col1, sysdate );
      9    commit;
     10  end;
     11  /
    
    Trigger created.
    
    SQL> insert into t values( 1 );
    
    1 row created.
    
    SQL> rollback;
    
    Rollback complete.
    
    SQL> select * from t;
    
    no rows selected
    
    SQL> select * from t_shadow;
    
          COL1 DT
    ---------- ---------
             1 09-NOV-11
    

    请注意,如果您发现自己使用自治事务而不是持久日志记录,那么您几乎可以肯定做错了什么。自治事务是一个非常危险且经常被滥用的功能。

    【讨论】:

    • 这听起来很有趣。今天晚些时候我会尝试一下,我会告诉你的。我的问题是,如果开发人员回滚更改,我需要记录数据库发生的所有更改。
    • +1 用于警告自主触发的危险和完整的代码示例。
    • 回滚的更改并不是真正的更改。
    • 我明白了,但仍然有人对我想跟踪的数据库执行了操作
    【解决方案2】:

    您需要将触发器声明为自治事务

    PRAGMA AUTONOMOUS_TRANSACTION;
    

    这将触发器代码与主事务解耦,因此即使主插入表(触发触发器)回滚,触发器也会在不同的事务上下文中执行,并且可以独立提交/回滚。

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 2011-08-31
      • 2021-04-24
      • 2013-10-12
      • 2010-11-09
      • 2019-11-26
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      相关资源
      最近更新 更多