web-dev-qa-db-ja.com

挿入、更新、削除をOracle DBの同じ「代わりに」トリガーで組み合わせる方法は?

Instead Ofトリガーを作成する場合、SQL Developerでは、3つのDMLアクションすべてを同じトリガーに含めることができます。

enter image description here

結果の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アクションが実行されたかをどのようにして知るのですか?

どうも

1
johny why

From トリガー本体のコーディング

トリガーを起動した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;
5
schurik