【问题标题】:How to get exact updated column name in oracle trigger?如何在 oracle 触发器中获取准确的更新列名?
【发布时间】:2018-10-29 18:33:34
【问题描述】:

我将创建一个触发器来审计一个表。假设我的表定义如下。

COUNTRY_ID   NOT NULL CHAR(2)      
COUNTRY_NAME          VARCHAR2(40) 
REGION_ID             NUMBER

我的日志表创建如下。

create table country_log(
  username varchar2(10),
  transaction_date date,
  new_value varchar(20),
  old_value varchar(20)
)

我的半完成触发器如下所示。

CREATE OR REPLACE TRIGGER tr_countryTable
AFTER UPDATE ON COUNTRIES
FOR EACH ROW
BEGIN
  insert into country_log (username,transaction_date,new_value,old_value ) values (USER, sysdate,**:New, :Old** );
END;
/

我需要知道如何获取准确更新的列的新旧值,而不是比较 :old 和 :new 中的每个列值。

【问题讨论】:

  • 如果更新了多个列怎么办?您想为每列记录多行吗?
  • 假设一次只有一个字段将在此表上更新。
  • 顺便说一下,Oracle 中的标准字符串数据类型是varchar2,而不是varcharchar
  • 更改日志不能识别更改的行有什么用?

标签: oracle plsql database-trigger


【解决方案1】:

UPDATE 触发器中,可以使用UPDATING 谓词指定列名,以确定是否正在更新命名列。让我们定义一个触发器如下:

CREATE OR REPLACE TRIGGER tr_countryTable
AFTER UPDATE ON COUNTRIES
FOR EACH ROW
BEGIN
   IF UPDATING ('COUNTRY_NAME') THEN 
     -- :new.COUNTRY_NAME is new value
     -- :old.COUNTRY_NAME is old value
   END IF;

   IF UPDATING ('REGION_ID') THEN 
     -- :new.REGION_ID is new value
     -- :old.REGION_ID is old value
   END IF;

END;
/

Oracle 11g triggers documentation

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 2019-06-24
    • 2017-07-05
    • 2016-12-01
    • 2014-05-28
    • 2022-01-27
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    相关资源
    最近更新 更多