Trigger
插入後和更新後的觸發器 - 良好實踐
為 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;