Trigger

插入後和更新後的觸發器 - 良好實踐

  • March 12, 2014

為 After Insert 設置一個單獨的觸發器,為 After Update 設置另一個觸發器是一個很好的做法,或者兩者在相同的邏輯中沒有問題?

同樣從性能的角度來看,將它們隔離會更好嗎?

從性能的角度來看,如果他們正在做同樣的事情,那麼就不會有區別。如果您的觸發器執行測試以查看需要執行的操作(即,需要將更新的行與新插入的行區別對待),那麼如果對常見情況次優的查詢計劃被記憶體並針對這些情況重用,則可能會產生影響。

對於程式碼維護 PoV,決策還取決於行為的差異。如果在每種情況下採取的操作相同(或幾乎相同),那麼使用一段程式碼而不是兩段程式碼是有意義的(因此,如果您修復了一個錯誤,則不必記住在另一個位置複製修復) - 在這種情況下,除非存在顯著的性能差異,否則首選對兩個操作使用一個觸發器。如果觸發器的每個觸發器的操作明顯不同,則將它們分開,再次出於程式碼清晰的原因。

當然,這也取決於您使用的數據庫系統:不同的系統會有不同的性能警告,您可能需要關注這些警告。

我認為好的做法是使用COMPOUND TRIGGER

來自:http ://www.databasejournal.com/features/oracle/compound-triggers-in-oracle-11g.html:

Oracle 11g 對觸發器提供了新的改進,即復合觸發器,它可以在發生更新、插入或刪除之前和之後執行。這使得在一個觸發器中執行類似於儲存過程的處理成為可能,而無需編寫這樣的過程來從傳統觸發器呼叫。複合觸發器可用於避免可怕的 mutating table 錯誤或根據所需標準處理和接受或拒絕對錶的更新。

create or replace
TRIGGER COMPOUND_TRIGGER_EXAMPLE FOR INSERT  OR UPDATE ON TEST_TABLE
COMPOUND TRIGGER

BEFORE EACH ROW IS BEGIN

   IF INSERTING THEN

    -- YOUR CODE HERE;      

   ELSIF UPDATING THEN

    -- YOUR CODE HERE;      

   END IF;

END BEFORE EACH ROW;

AFTER EACH ROW IS BEGIN

   IF INSERTING THEN

    -- YOUR CODE HERE;      

   ELSIF UPDATING THEN

    -- YOUR CODE HERE;      

   END IF;  


END COMPOUND_TRIGGER_EXAMPLE;

引用自:https://dba.stackexchange.com/questions/60775