web-dev-qa-db-ja.com

ORACLEおよびTRIGGERS(挿入、更新、削除)

行が挿入、更新、または削除されるたびに起動されるテーブルでトリガーを使用したいと思います。

私はこのようなことを書きました:

CREATE or REPLACE TRIGGER test001
  AFTER INSERT OR DELETE OR UPDATE ON tabletest001
  REFERENCING OLD AS old_buffer NEW AS new_buffer 
  FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00') 

そしてそれは動作します。行が挿入、更新、または削除された場合も同じことをしたいので、トリガーで何が起こっているのかを知りたいです。行が挿入または更新されたかどうかを見つけることができたと思います(old_bufferはnew_bufferで確認できます)。行が削除されたかどうかを知るにはどうすればよいですか?

23
LeftyX

から トリガーを使用

トリガーを起動したDML操作の検出

複数のタイプのDML操作でトリガーを起動できる場合(たとえば、ON INSERT OR DELETE OR UPDATE OF Emp_tab))、トリガー本体はトリガーを起動するステートメントのタイプを確認する条件付き述語INSERTING、DELETING、およびUPDATING。

そう

IF DELETING THEN ... END IF;

あなたのケースで動作するはずです。

37
devio

このようにコードを変更しましたが、動作します:

CREATE or REPLACE TRIGGER test001
  AFTER INSERT OR UPDATE OR DELETE ON tabletest001
  REFERENCING OLD AS old_buffer NEW AS new_buffer 
  FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00') 

DECLARE
      Operation       NUMBER;
      CustomerCode    CHAR(10 BYTE);
BEGIN

IF DELETING THEN 
  Operation := 3;
  CustomerCode := :old_buffer.field1;
END IF;

IF INSERTING THEN 
  Operation := 1;
  CustomerCode := :new_buffer.field1;
END IF;

IF UPDATING THEN 
  Operation := 2;
  CustomerCode := :new_buffer.field1;
END IF;    

// DO SOMETHING ...

EXCEPTION
    WHEN OTHERS THEN ErrorCode := SQLCODE;

END;
22
LeftyX

NEW値(または名前を変更したNEW_BUFFER)は、INSERTINGおよびUPDATINGの場合にのみ使用可能です。 DELETINGには、OLD(OLD_BUFFER)を使用する必要があります。したがって、トリガーは次のようになります。

CREATE or REPLACE TRIGGER test001
  AFTER INSERT OR DELETE OR UPDATE ON tabletest001
  REFERENCING OLD AS old_buffer NEW AS new_buffer 
  FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00') 

Field1を「HBP000」から別のものに更新するコードに対応するために、トリガー内にロジックを追加する必要がある場合があります。

5
Tony Andrews

2つのトリガーに分けます。 1つは削除用で、もう1つは挿入/更新用です。

1
rkellerm