Oracle

Oracle 觸發器 - 更新前和插入前 - 單獨還是組合?

  • July 28, 2014

我正在執行 Oracle DB 9i。

我有一個帶有各種約束的表,以確保數據完整性。除了約束之外,我還設置了觸發器BEFORE INSERTBEFORE UPDATE確保必要的數據進入表中,在某些情況下允許應用程序層從他們的查詢中省略資訊,並且在某些情況下強制它存在。

我需要對 my 執行的操作與 myBEFORE 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,您最好的選擇是在觸發器內包含一個功能性工作單元,以便觸發器的作用沒有差異。根據我的經驗,開發人員/業務分析師通常傾向於考慮事務工作流程。

我發現這在我或其他人必須解決與觸發觸發器相關的使用者數據損壞的後果時特別有用 - 您必須嘗試拼湊邏輯的觸發器越少,就越容易了解如何數據被操縱。

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