新旧列中的触发器

Posted

技术标签:

【中文标题】新旧列中的触发器【英文标题】:triggers in new and old columns 【发布时间】:2009-12-07 10:57:14 【问题描述】:

为什么我们不能在语句级触发器中使用 :new 和 :old 列?

【问题讨论】:

【参考方案1】:

因为可能是语句插入/删除/更新多行的情况。所以没有newold列。

例子:

update FOO set a = 12 where b = 9;

或者:

delete from FOO where b = 9;

或者:

insert into FOO (a, b) select 12, x from BAR;

如果FOO表有语句触发器,这三句话无法判断你是在对无、单行还是多行进行操作。

【讨论】:

【参考方案2】:

因为 DML 可能是基于集合的,从而影响表中的多行。事实上,由于 SQL 是正确地基于集合的,这应该是通常的情况。因此,语句级触发器无法确定您指的是哪个 :OLD 和哪个 :NEW 值。

【讨论】:

【参考方案3】:

如前所述,语句级触发器可以用于一对多行更改,因此 :new 和 :old 不可用。

如果您需要跟踪 :new 和 :old 值并需要在语句触发器中访问它们,您可以创建一个行级触发器来存储新值和旧值以供语句级使用。这是我们之前解决此问题的一种方法

包装:

create or replace package table_trigger_helper is

  subtype subtype_rowtype is table_name$rowtype;
  type table_rowtype is table of subtype_rowtype;

  v_old table_rowtype := table_rowtype();
  v_new table_rowtype := table_rowtype();

end table_trigger_helper;
/

行级触发器:

create or replace trigger row_level_trigger_name
  after insert or delete or update
  on table_name
  for each row
declare

  r_old table_trigger_helper.table_rowtype := NULL;
  r_new table_trigger_helper.table_rowtype := NULL;
  i pls_integer;

begin

 if update or deleting then
  r_old.column_one := :old.column_one
  ...
 end if;

 if update or inserting then
  r_new.column_one := :new.column_one
 end if;

  table_trigger_helper.v_old.extend();
  table_trigger_helper.v_new.extend();
  i := table_trigger_helper.v_old.last;

  table_trigger_helper.v_old( i ) := r_old;
  table_trigger_helper.v_new( i ) := r_new;  
end row_level_trigger_name;
/  

语句级触发器:

create or replace trigger statement_level_trigger_name
 after insert or delete or update
 on table_name
declare
begin
  --process through your new and old records;
  --table_trigger_helper.v_old
  --table_trigger_helper.v_new
end statement_level_trigger_name;
/

【讨论】:

以上是关于新旧列中的触发器的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 触发器:更新查询新旧数据

使用 Sybase 触发器编写动态语句,使用所有新旧值创建您自己的复制事务语句日志?

根据列中的状态更改创建触发器并在表的另一列中插入值

phPmyAdmin,如何创建一个触发器,当有人更新一行中的任何列时,它将在特定列中添加一个“1”

时刻列中的触发函数在GridX中排序

使用查询减少数字列中的值