如何在Oracle上的BEFORE UPDATE触发器上获取更新的列索引?

时间:2014-04-14 13:24:36

标签: oracle plsql triggers plsqldeveloper

在我的应用程序中,用户可以更新一些数据。我想在AG_TABLE_UPDATE_HISTORY表中保存所有更新的列及其值。表格的结构如下:

CREATE TABLE "AG_TABLE_UPDATE_HISTORY"
  (
    "TABLE_NAME"     VARCHAR2(20 BYTE),
    "ROW_ID"         VARCHAR2(20 BYTE),
    "COLUMN_NAME"    VARCHAR2(20 BYTE),
    "PREVIOUS_VALUE" VARCHAR2(20 BYTE),
    "CURRENT_VALUE"  VARCHAR2(20 BYTE)
  )

我知道,我可以通过在:old中逐个比较:newBEFORE UPDATE trigger列来获取更新列的名称。 但是,我想知道Oracle有没有更好的方式提供给我们?

1 个答案:

答案 0 :(得分:1)

答案取决于您希望仅保留UPDATE语句中更改的值,或者您希望跟踪已更新的列的事实。 Oracle建议UPDATING()函数在触发器中起作用,这可能会有所帮助:

SQL> create table t (x int, y varchar2(10), z date)
  2  /

SQL> insert into t values(1,'A',sysdate)
  2  /

SQL> create or replace trigger tr_t
  2  before update on t
  3  for each row
  4  begin
  5    if updating('X') then
  6      dbms_output.put_line('Old X is '||:old.X);
  7      dbms_output.put_line('New X is '||:new.X);
  8    end if;
  9    if updating('Y') then
 10      dbms_output.put_line('Old Y is '||:old.Y);
 11      dbms_output.put_line('New Y is '||:new.Y);
 12    end if;
 13    if updating('Z') then
 14      dbms_output.put_line('Old Z is '||:old.Z);
 15      dbms_output.put_line('New Z is '||:new.Z);
 16    end if;
 17  end;
 18  /

SQL> set serveroutput on
SQL> update t set x = 2;
Old X is 1                                                                      
New X is 2                                                                      

1 row updated.

SQL> update t set x = 1, y='C';
Old X is 2                                                                      
New X is 1                                                                      
Old Y is A                                                                      
New Y is C                                                                      

1 row updated.

SQL> update t set x = 1, y='C', z = sysdate+1;
Old X is 1                                                                      
New X is 1                                                                      
Old Y is C                                                                      
New Y is C                                                                      
Old Z is 14.04.14                                                               
New Z is 15.04.14                                                               

1 row updated.