【问题标题】:How to get updated columns indices on BEFORE UPDATE trigger on Oracle?如何在 Oracle 上的 BEFORE UPDATE 触发器上获取更新的列索引?
【发布时间】:2014-05-28 11:40:37
【问题描述】:

在我的应用程序中,用户可以更新一些数据。我想将所有更新的列及其值保存在 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)
  )

我知道,我可以通过一一比较 BEFORE UPDATE trigger 中的 :old:new 列来获得更新的列名称。 但是,我想知道 Oracle 提供给我们的更好的方法吗?

【问题讨论】:

标签: oracle plsql triggers plsqldeveloper


【解决方案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.

【讨论】:

  • 谢谢,但我已经说过了:我知道,我可以通过在BEFORE UPDATE 触发器中一一比较:old:new 列来获得更新的列名。
  • UPDATING() 函数说明该列是 UPDATE 语句的一部分,即使旧值和新值相同 - 请参阅最后一个更新语句。这是 UPDATING() 和比较值之间的区别。
  • 谢谢。虽然这不是最好的方式,但这种方式更适合我的情况。
猜你喜欢
  • 2018-05-16
  • 2021-04-05
  • 2016-05-02
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
相关资源
最近更新 更多