有人能告訴我如何找到模式觸發器中新值和舊值之間的差異嗎? 觸發器在INSERT
,UPDATE
,DELETE
上運行。我知道trgigger可以使用:old.*
和:new.*
如何識別架構觸發器中的更改值?
回答
我假定你的意思是你有一個行級觸發器,而不是一個模式級觸發器。例如,某人在架構中的某個表上執行DDL時會觸發模式級別的觸發器。當您談論架構級觸發器時,談論新舊值是毫無意義的。
如果我們在談論行級觸發器,我假設您只對UPDATE
報表感興趣。如果你插入或刪除數據,你自然會改變表中的每一列。
因此,如果我們正在討論在UPDATE
上觸發的行級觸發器,則可以使用UPDATING
函數。這會告訴你某個特定列是否正在更新。然而,它並不一定告訴你數據正在改變。聲明
UPDATE table_name
SET col1 = col1;
更新COL1
的每一行中TABLE_NAME
,但實際上並沒有改變任何數據。如果這是可以接受的,你可以這樣做
CREATE TRIGGER trg_table_name
BEFORE UPDATE ON table_name
FOR EACH ROW
BEGIN
IF(updating('COL1'))
THEN
<<col1 was updated>>
END IF;
IF(updating('COL2'))
THEN
<<col2 was updated>>
END IF;
...
END;
你可以做的是更加動態的只是在循環中的數據USER_TAB_COLS
,即
SQL> ed
Wrote file afiedt.buf
1 create table foo (
2 col1 number,
3 col2 number,
4 col3 number
5*)
SQL>/
Table created.
SQL> create trigger trg_foo
2 before update on foo
3 for each row
4 begin
5 for cols in (select *
6 from user_tab_cols
7 where table_name = 'FOO')
8 loop
9 if updating(cols.column_name)
10 then
11 dbms_output.put_line('Updated ' || cols.column_name);
12 end if;
13 end loop;
14 end;
15/
Trigger created.
SQL> set serveroutput on;
SQL> insert into foo values(1, 2, 3);
1 row created.
SQL> update foo
2 set col2 = col2 + 1,
3 col3 = col3 * 2;
Updated COL2
Updated COL3
1 row updated.
雖然這可以告訴你所有正在更新的列,但是,主要的缺點是,有沒有辦法訪問類似的時尚動感的:new
和:old
值。因此,您可以發現COL2
已更新,但您無法確定:new.col2
或:old.col2
值是不是靜態引用這些值。
根據您要解決的問題,您可以通過查看數據字典中的數據來編寫動態生成觸發器的代碼。沿着這個塊的東西線會產生打印出所有的:new
值
DECLARE
l_tbl_name VARCHAR2(100) := 'FOO';
l_sql_stmt VARCHAR2(4000);
BEGIN
l_sql_stmt := 'CREATE OR REPLACE TRIGGER trg_' || l_tbl_name ||
' BEFORE UPDATE ON ' || l_tbl_name ||
' FOR EACH ROW ' ||
'BEGIN ';
FOR cols IN (SELECT *
FROM user_tab_cols
WHERE table_name = l_tbl_name)
LOOP
l_sql_stmt := l_sql_stmt ||
' IF UPDATING(''' || cols.column_name || ''') ' ||
' THEN ' ||
' dbms_output.put_line(:new.' || cols.column_name || '); ' ||
' END IF; ';
END LOOP;
l_sql_stmt := l_sql_stmt || ' END; ';
dbms_output.put_line(l_sql_stmt);
EXECUTE IMMEDIATE l_sql_stmt;
END;
:old :new
=======================================================
insert | null | new value to be inserted
update | old value | new value to be updated
delete | old value | null
=======================================================
上述值是參考稱爲行級觸發器,這意味着被觸發的每一行每次燒製。
上面的表格顯示了關於上述dml語句的新舊值,我們舉個例子。
Insert into abc (1,'gaurav soni',pune);--empid,name,city
假設我有表ABC一個觸發器,它插入到表ABC時,檢查城市是否出現在位置表或不(我知道我們可以用外鍵約束做到這一點),但是這是一個例子,所以我們可以參考:new.city
這個城市,但是因爲它的值是null
,所以在插入的情況下我們不能指:old .city
。
在update
情況下,我們可以參考兩個:new and :old value
在delete
大家可以參考情況下,只有old value
作爲new value
是在deleting
情況null
。
注意:在inserting
情況下的delete
,:old
情況下使用的:new
不會給你compile time error
,但肯定會繁榮,給你run time error
您可以使用INSERTING,DELETING
子句來避免這種情況。
謝謝某特定表的觸發器,但我比較每列的唯一途徑?我搜索了一個函數,它給了我更改的列 – destiny 2012-03-17 23:11:50
@destiny:我沒有得到你要找的東西,請詳細說明你的答案,可能是賈斯汀幫助你的答案,但他也是假設,請詳細說明其他人可能會明白你在找什麼。 – 2012-03-18 04:54:56
- 1. 如何識別sharedpreferences中更改的值?
- 2. 如何更改Oracle中的觸發器?
- 3. 實體框架不更新由觸發器修改的值
- 4. 如何更改AFTER INSERT觸發器中的列值?
- 5. 如何更改觸發器中表格的值
- 6. 如何在TextEdit值更改時觸發?
- 7. SQL Server - 在架構中的觸發器AFTER後觸發表
- 8. 如何將更改的行中的值發送到postgres中的觸發器?
- 9. 如何在命令觸發器中識別語音
- 10. ORA-04091 - 如何更改觸發器觸發的表?
- 11. TSql觸發器只需要觸發其值已更改的列
- 12. PyQt:我如何更改customContextMenu觸發器?
- 13. Informix觸發器更改插入值
- 14. 在MySQL觸發器更改值與PHP?
- 15. 觸發器將空值更改爲NULL
- 16. PHP:如何識別和更改數組中的重複值?
- 17. PySpark架構無法識別
- 18. Jenkins:識別觸發器類型
- 19. 無界限語音識別觸發器
- 20. Oracle觸發器無法識別插入
- 21. 架構兼容性的觸發器
- 22. 如何識別導致調度程序異常的觸發器?
- 23. MVC3 EditorFor()更改JavaScript模型中的值無法識別更改
- 24. 如何觸發jQuery中的URL更改?
- 25. 如何識別在TFS構建2015期間發生更改的文件
- 26. Sybase:如何訪問更新觸發器中已更改的列
- 27. 如何在切換觸發器更改時觸發事件?
- 28. 如何在密碼更改時觸發sql觸發器
- 29. 更新值的觸發器
- 30. 如何識別DOM何時被更改?
謝謝!而已!, – destiny 2012-03-19 09:56:32