Oracle
Oracle 觸發器 - 更新前和插入前 - 單獨還是組合?
我正在執行 Oracle DB 9i。
我有一個帶有各種約束的表,以確保數據完整性。除了約束之外,我還設置了觸發器
BEFORE INSERT
並BEFORE UPDATE
確保必要的數據進入表中,在某些情況下允許應用程序層從他們的查詢中省略資訊,並且在某些情況下強制它存在。我需要對 my 執行的操作與 my
BEFORE INSERT
不同BEFORE UPDATE
。我的問題是這樣的:
我可以有一個使用 的通用觸發器
IF / THEN
,還是應該製作單獨的觸發器?例如:
-- Scenario 1 CREATE OR REPLACE TRIGGER my_trg BEFORE INSERT OR UPDATE ON my_table FOR EACH ROW BEGIN IF UPDATING THEN IF :NEW.my_col IS NULL THEN raise_application_error(...); END IF; IF :NEW.my_col2 IS NULL THEN :NEW.my_col2 := (...); END IF; END IF; IF INSERTING THEN IF :NEW.my_col3 IS NULL THEN SELECT my_seq.NEXTVAL INTO :NEW.my_col3 FROM DUAL; END IF; IF :NEW.my_col4 IS NULL THEN (...) END IF; END IF; END; /
要麼:
-- Scenario 2 CREATE OR REPLACE TRIGGER my_trg1 BEFORE INSERT ON my_table FOR EACH ROW BEGIN IF :NEW.my_col3 IS NULL THEN SELECT my_seq.NEXTVAL INTO :NEW.my_col3 FROM DUAL; END IF; IF :NEW.my_col4 IS NULL THEN (...) END IF; END; / CREATE OR REPLACE TRIGGER my_trg2 BEFORE UPDATE ON my_table FOR EACH ROW BEGIN IF :NEW.my_col IS NULL THEN raise_application_error(...); END IF; IF :NEW.my_col2 IS NULL THEN :NEW.my_col2 := (...); END IF; END; /
目前,這兩個觸發器是結合在一起的。我應該把它們分開嗎?
您對數據執行的操作在插入/更新部分之間在技術上是不同的,但是業務邏輯差異呢?IMO,您最好的選擇是在觸發器內包含一個功能性工作單元,以便觸發器的作用沒有差異。根據我的經驗,開發人員/業務分析師通常傾向於考慮事務工作流程。
我發現這在我或其他人必須解決與觸發觸發器相關的使用者數據損壞的後果時特別有用 - 您必須嘗試拼湊邏輯的觸發器越少,就越容易了解如何數據被操縱。