ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

Oracleのトリガーを勉強中

目的のトリガーの作成方法は、把握できました。
f:id:AJYA:20141022053428j:plain
photo credit: Håkan Dahlström via photopin cc

データベースにOracleを使っているシステムで、エラーがごくたまに発生しているとの連絡がありました。
Aシステムがデータをワークテーブルに入れて、Bシステムがワークテーブルのデータを加工して取り込んでいます。
ある条件のデータを加工して取り込んだ結果、エラーの発生に繋がっているのではないかとのことでした。

検証のためには、ワークテーブルのデータを使って確認すればいいのですが、Bシステムでデータを取り込む際に削除しています。
そのため、削除の際にトリガーで別テーブルにコピーをすることになりました。

作成したトリガー

今までにトリガーを作成したことが、どのデータベースでもなかったので、一からの勉強となりました。
複数のWebサイトを見て試行錯誤した結果、以下のようにすればレコードのコピーができることがわかりました。

CREATE OR REPLACE TRIGGER TRIGGER1 
BEFORE DELETE ON TMP
FOR EACH ROW
BEGIN
 INSERT INTO TMP2(COL1, COL2) VALUES (:OLD.COL1, :OLD.COL2);
END;

TRIGGER1トリガー名です。
TMPテーブルのレコードが削除される前に、削除対象のレコードをコピーします。
:OLDで処理前の値が利用できます。

:OLDにコピー元の値が格納されていることを知った後は簡単でした。

参考にしたサイト

以下のサイトが今回の内容の作成には役立ちました。
ORACLE/TRIGGER編 - オラクルちょこっとリファレンス

トリガーの定義 (DML Event Trigger) - オラクル・Oracleをマスターするための基本と仕組み

全ては時の中に… : 【Oracle】トリガの作成