行が挿入、更新、または削除されるたびに起動されるテーブルでトリガーを使用したいと思います。
私はこのようなことを書きました:
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で確認できます)。行が削除されたかどうかを知るにはどうすればよいですか?
から トリガーを使用 :
トリガーを起動したDML操作の検出
複数のタイプのDML操作でトリガーを起動できる場合(たとえば、ON INSERT OR DELETE OR UPDATE OF Emp_tab))、トリガー本体はトリガーを起動するステートメントのタイプを確認する条件付き述語INSERTING、DELETING、およびUPDATING。
そう
IF DELETING THEN ... END IF;
あなたのケースで動作するはずです。
このようにコードを変更しましたが、動作します:
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;
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」から別のものに更新するコードに対応するために、トリガー内にロジックを追加する必要がある場合があります。
2つのトリガーに分けます。 1つは削除用で、もう1つは挿入/更新用です。