簡體   English   中英

在新列和舊列中觸發

[英]triggers in new and old columns

為什么我們不能在語句級觸發器中使用:new和:old列?

因為可能是語句插入/刪除/更新多於一行的情況。 因此,沒有列或列。

例:

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表具有語句觸發器,則在這三個句子中無法判斷您是對單行,單行還是多行進行操作。

因為DML可能是基於集合的,所以會影響表中的多行。 實際上,由於SQL是基於集合的,因此通常是這種情況。 因此,語句級觸發器無法確定您所指的:OLD和哪個:NEW值。

如前所述,語句級觸發器可以用於多行更改,因此: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;
/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM