PostgreSQLが提供するCREATE TRIGGERに加え、OR REPLACEオプションおよびDOオプションを指定して新しいトリガを定義できます。
記述形式
CREATE [ OR REPLACE ][ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] } ON table_name [ FROM referenced_table_name ] { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } } [ FOR [ EACH ] { ROW | STATEMENT } ] [ WHEN ( condition ) ] { EXECUTE PROCEDURE function_name ( arguments ) | DO [ LANGUAGE lang_name ] code }
説明
CREATE TRIGGERについては、“PostgreSQL 文書”の“サーバプログラム”の“トリガ”を参照してください。ここでは、OR REPLACEオプションおよびDOオプションについて説明します。
OR REPLACEオプションおよびDOオプションを使用して作成されたトリガは、指定したテーブルまたはビューと関連付けられ、特定のイベントが発生した時に、指定された関数function_nameまたはDO(無名コードブロック)の手続き言語で書かれたコードブロックを実行します。
パラメータ
指定したトリガがテーブルに対して未定義の場合、新規にトリガを定義します。
指定したトリガがテーブルに対して定義済みの場合、指定したトリガの定義内容に置換します。
関数を実装している言語の名前です。CREATE TRIGGERとしてplpgsqlをサポートしています。
特定のイベントが発生した時に、指定した手続き言語で書かれたコードブロックを実行します。無名コードブロックは、関数のように事前に定義する必要がありません。作成方法は、各手続き言語のトリガプロシージャの作成方法に従います。
注意
通常のトリガとして定義されたトリガに対して、制約トリガでREPLACEすることはできません。
制約トリガとして定義されたトリガに対して、通常のトリガでREPLACEすることはできません。
DOオプションを指定したトリガは、EXECUTE PROCEDUREを指定したトリガにREPLACEすることはできません。
EXECUTE PROCEDUREを指定したトリガは、DOオプションを指定したトリガにREPLACEすることはできません。
使用例
accountsテーブルの行が更新される直前にDOで指定した手続き言語で書かれたコードブロックを実行します。
(LANGUAGEがplpgsqlの場合の例)
CREATE TRIGGER check_update BEFORE UPDATE ON accounts FOR EACH ROW DO $$BEGIN RETURN NEW; END;$$ ;
参考
DOオプションを指定してトリガが作成された場合、内部的に『“スキーマ名”.”on表名”_”トリガ名”_TRIGPROC(通番)』という関数が定義されます。