oracle - 如何在oracle触发器中获取准确更新的列名称?

标签 oracle plsql database-trigger

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

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 中的每个列值。

最佳答案

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

关于oracle - 如何在oracle触发器中获取准确更新的列名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53028904/

相关文章:

json - 我们可以在不使用循环的情况下获得oracle中列表属性的总和吗?

java - 如何将 table%rowtype 的 oracle pl/sql out 参数引用为 java 中的对象

mysql - 如何创建从表中获取值并更新不同表的触发器

mysql - 触发器不会在 MySql WorkBench 中运行

java - 为什么hibernate在insert和delete操作时会生成 'T_' prefix tableName?

mysql - 将两个相同的表(实际上是表字段)合并为一个

Oracle:如何使用 DBMS_REDEFINITION 包对列重新排序?

mysql - 查找表在 2019 年是一种好的数据库实践吗?

sql - Oracle SQL 按带计数的列分组,但仅当该列为空或 0 时

postgresql - 如何指定一个触发器函数只在表中有记录时才执行?