トリガーのつくり方
トリガーとは、INSERT や UPDATE, DELETE(イベントと呼ぶ)の際に連動して行なう一連の処理を自動化してくれる便利な機能。
トリガーをつくるときには、そのトリガーが呼び出される条件を定義する。
CREATE TRIGGER トリガー名 AFTER insert ON テーブル名 FOR EACH ROW EXECUTE PROCEDURE 関数名();
この場合は、「テーブル名」に対して insert が発生した時に、対象となる行に対応して「関数名」を実行するという意味である。
注意する点としては、呼び出す関数には引数をつけることが出来ないということ。
これに対応する関数の例。
CREATE OR REPLACE FUNCTION 関数名() RETURNS trigger AS $$ BEGIN IF NEW.parentSeq IS NOT NULL THEN UPDATE BbsMaster SET countChild = countChild+1, updateTime = CURRENT_TIMESTAMP WHERE bbsSeq = NEW.parentSeq; END IF; RETURN NEW; END; $$ LANGUAGE 'plpgsql';
NEWとは、insertされる「行」をそのまま表しています。「NEW.parentSeq」は、この行の値 parentSeq を参照しています。
この場合、インサートした行のparentSeqがnullでなければ、BbsMasterテーブルの countChildをカウントアップしてupdateTimeに現在時刻を更新する。その際、「parentSeq=挿入行の値」というwhere句を条件として与えること。という意味を表しています。
関数を定義するときの注意として、
- トリガー用の関数は引数を受け取れない
- 戻り値として、trigger型を宣言する
- 戻り値は、NEWとかOLDを使えば、それでオケ
というのを忘れないでください。
トリガーを使えば、updateの際に更新時刻をトリガーで自動的に与えることが出来て便利ですよ。
参照
- http://www.postgresql.jp/document/pg824doc/html/sql-createfunction.html
- http://www.postgresql.jp/document/pg824doc/html/sql-createtrigger.html
- http://www.postgresql.jp/document/pg824doc/html/trigger-definition.html
- http://www.postgresql.jp/document/pg824doc/html/plpgsql.html
- http://www.postgresql.jp/document/pg824doc/html/plpgsql-trigger.html