こんにちは、
職人見習いの木村です。

データベースに何かしら処理が走った際に、決まった処理をする場合、トリガーを設定すると便利です。
今回は、PostgreSQLでトリガーを設定してみます。

まずはトリガー関数を作成します。

CREATE OR REPLACE FUNCTION hoge_func()
  RETURNS "trigger" AS
$BODY$
declare
begin
  insert into hoge (
    id,
    new_val,
    old_val,
    insert_datetime
  ) values (
    old.id,
    new.value,
    old.value,
    now()
  );
return new;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE;
ALTER FUNCTION hoge_func() OWNER TO postgres;

hoge_funcという関数名を定義し、関数が呼び出された際の処理をbeginとendの間に記述していきます。
new.[カラム名]と記述すると、トリガーが走った後のカラムの値を呼び出し、逆にold.[カラム名]を記述するとトリガーが走る前の値を呼び出します。

続いて、hogeテーブルにトリガーを仕込みます。
今回は、UPDATEされた後にトリガーを呼び出すように設定してみました。

CREATE TRIGGER update_hoge_tri
  AFTER UPDATE
  ON hoge
  FOR EACH ROW
  EXECUTE PROCEDURE update_hoge_func();

以上で、hogeテーブルにUPDATEがかかった後に、hoge_func関数が実行されるような設定になりました。

今回は、UPDATEが実行された後にトリガーを仕込みましたが、トリガー実行条件には以下の種類があります。

BEFORE テーブルに対してのデータ操作が行われる前にトリガーを実行する。
AFTER テーブルに対してのデータ操作が行われた後にトリガーを実行する。
INSTEAD OF テーブルに対してのデータ操作が行われた際に、データ操作は実行されず、トリガーのみを実行する。

※この記事は、なかの人(moresmileman)が書いています。