Oracle

在 Oracle db 中,如何在同一個“Instead Of”觸發器中組合插入、更新和刪除?

  • September 23, 2016

創建Instead Of觸發器時,Sql Developer 允許在同一個觸發器中包含所有 3 個 DML 操作:

在此處輸入圖像描述

結果 SQL 如下所示:

CREATE OR REPLACE TRIGGER TRIGGER1 
INSTEAD OF DELETE OR INSERT OR UPDATE ON PO_COSTED_BOM_V 
BEGIN
 NULL;
END;

我可以結合起來InsertUpdate這樣:

CREATE OR REPLACE TRIGGER TRIGGER1 
INSTEAD OF INSERT OR UPDATE OR DELETE ON PO_COSTED_BOM_V 
BEGIN
 UPDATE SRC_TBL SET CFG_VALUE = :NEW.CFG_VALUE
 WHERE CFG_NAME = :NEW.CFG_NAME;
 IF SQL%NOTFOUND THEN
     INSERT INTO SRC_TBL (CFG_NAME, CFG_VALUE) 
        VALUES(:NEW.CFG_NAME, :NEW.CFG_VALUE);
 END IF;
END;
  • 但是我如何將Delete語句放入觸發器中?
  • 觸發器如何知道執行了哪個 DML 操作?

謝謝

編碼觸發器主體

檢測觸發觸發器的 DML 操作

如果不止一種類型的 DML 操作可以觸發觸發器(例如,ON INSERT OR DELETE OR UPDATE OF emp),則觸發器主體可以使用條件謂詞 INSERTING、DELETING 和 UPDATING 來檢查觸發觸發器的語句類型。

在觸發器主體的程式碼中,您可以根據觸發觸發器的 DML 操作類型執行程式碼塊:

IF INSERTING THEN ... END IF;
IF UPDATING THEN ... END IF;
IF DELETING THEN ... END IF;

在你的情況下

...
if inserting then

INSERT INTO SRC_TBL (CFG_NAME, CFG_VALUE) 
        VALUES(:NEW.CFG_NAME, :NEW.CFG_VALUE);

elsif updating then

UPDATE SRC_TBL SET CFG_VALUE = :NEW.CFG_VALUE
 WHERE CFG_NAME = :NEW.CFG_NAME;

elsif deleting then

...

END IF;

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