データベースを使用していると、どうしてもストアドプロシージャーを大なり小なり書く必要が出てきます。特に更新系のテーブルで履歴を取得する場合などはトリガーを使用すると便利です。ということで、Postgresでトリガーを実現する方法を確認しました。
Postgresでトリガーを実装する場合、Oracleとは異なりトリガーオブジェクトがストアドファンクションをコールするようなイメージになります。トリガーはイベントハンドラでストアドファンクションが実態という感じです。
[sql] -- ファンクションを削除する DROP function IF EXISTS f_table_cunction() CASCADE ;
-- ファンクションを作成する CREATE FUNCTION f_takusou_bp_status () RETURNS TRIGGER AS $$ DECLARE BEGIN INSERT INTO t_table_his ( col_a, col_b, ... )VALUES( -- NEWとOLDを使用して変更前後の値を取得できる OLD.col_a, OLD.col_b, ... );
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
-- トリガーの定義で、更新後に行データについて f_table_cunction を実行するように指定している CREATE TRIGGER trg_table AFTER UPDATE ON t_table_his FOR EACH ROW EXECUTE PROCEDURE f_table_cunction();
[/sql]
ある程度ストアドを記述したことがある人にはわかりやすい内容ではないでしょうか。こうしてまとめるまであまり気づきませんでしたが、PostgresのトリガーはOracleのパッケージに似ているような気がしなくもありません。いずれにしても、ファンクションだけを切り出すことが可能である点を考えるととても再利用性が高くてよいのではないかと思います。
ちなみに、Postgresについてはこちらの書籍がとてもわかりやすく網羅性が高いです。標準ドキュメント以外にも参考になると思います。