爲什麼我們不能在語句級觸發器中使用新列和舊列?新老列中的觸發器
Q
新老列中的觸發器
0
A
回答
4
因爲DML可能已經基於set,影響表中的多行。事實上,由於SQL是正確設置的,應該是通常的情況。因此,語句級別觸發器無法確定您的意思是:OLD和哪些:NEW值。
6
因爲這可能是該語句插入/刪除/更新多行的情況。所以沒有新的或舊的列。
例子:
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表有一個語句觸發器,在這三句話是沒有辦法告訴你是否在無,單行或多行上操作。
0
如前所述,語句級別觸發器可以用於一到多行更改,因此: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;
/
相關問題
- 1. mysql的觸發,新老
- 2. 新老觸發代碼
- 3. 老僞紀錄後插入觸發器
- 4. 觸發器中的非更新列
- 5. MySQL的觸發器「對列的更新」
- 6. 觸發器更新列的總和?
- 7. 跟蹤更新的列postgresql觸發器?
- 8. 從INSERT觸發器更新時觸發更新後未觸發
- 9. SQL Server觸發器更新列值
- 10. 觸發器按列連接成新表
- 11. 列更改觸發器更新
- 12. 列更新沒有使用觸發器
- 13. INSERT觸發器用於更新列
- 14. MySQL列更新與觸發器
- 15. 在列更新上調用觸發器
- 16. MySQL觸發器更新動態列
- 17. 更新面板觸發器未觸發
- 18. INSERT觸發器沒有觸發更新?
- 19. 隨着時間觸發器更改狀態列的值爲「老」,谷歌腳本
- 20. 更新值的觸發器
- 21. 在Postgres觸發器中使用tsvector更新觸發器
- 22. Azure WebJobs隊列觸發器不觸發
- 23. 在「更新後」觸發器中可用「更新列選擇」
- 24. 獨特列的觸發器
- 25. postgres觸發器中的更新值
- 26. 無法更新觸發器中的表
- 27. TSQL觸發器中的更新函數
- 28. 插入觸發器更新值後的mysql觸發器
- 29. 從觸發器(Sybase)中觸發觸發器的sql
- 30. JQuery觸發器 - 單擊一個觸發器應更新另一個觸發器