本章ではトリガ関数の作成方法を説明します。 トリガ関数はCや利用可能な手続き言語で作成することができます。 現在、SQL言語でトリガ関数を作成することはできません。
トリガを、INSERT、UPDATEまたはDELETE操作の前後に、行を変更する度、あるいは、SQL行毎に実行するように定義することができます。 トリガイベントが起こると、トリガ関数がそのイベントを扱う適切な時点で呼び出されます。
トリガ関数は、トリガ自体が作成される前までに定義しておく必要があります。 トリガ関数は、引数をとらない、trigger型を返す関数として宣言される必要があります。 (トリガ関数は、通常の関数で使用される引数という形ではなく、TriggerData構造体で入力を受け取ります。)
適切なトリガ関数が作成されると、CREATE TRIGGERを使用してトリガを構築することができます。 同一のトリガ関数を複数のトリガに使用することができます。
トリガ関数は呼出しエクゼキュータにテーブル行(HeapTuple型の値)を返します。 操作の前に発生するトリガは以下を行なうことができます。
NULL ポインタを返して、現在の行への操作をとばします(したがって、この行の挿入、更新、削除は行われなくなります)。
INSERTおよびUPDATEトリガの場合のみ、返される行が挿入される、もしくは更新される行になります。 これにより、トリガ関数で、挿入される行もしくは更新される行を変更することができます。
これらの動作を行いたくないBEFOREトリガについては、渡された行(つまり、INSERTおよびUPDATEトリガではNEW行、DELETEの場合はOLD行)と同じ行結果を返すように気をつける必要があります。
操作の後に発生するトリガでは戻り値は無視されますので、これらはよくNULLを返します。
同一リレーション、同一イベントに対して1つ以上のトリガが定義された場合、トリガはその名前のアルファベット順に発生します。 BEFOREトリガの場合では、各トリガで返される、変更された可能性がある行が次のトリガの入力となります。 もし、あるBEFOREトリガがNULLポインタを返したら、操作は中断し、残りのトリガは発生しません。
トリガ関数がSQLコマンドを処理する場合、これらの問い合わせがトリガを再度発行することがあります。 これはカスケードされたトリガと呼ばれます。 カスケードの段数に直接的な制限はありません。 カスケードの場合、同じトリガを再帰的に呼び出すことが可能です。 たとえば、INSERTトリガで同じテーブルに追加の行を挿入する問い合わせが実行された場合、その結果としてINSERTトリガが再度発行されます。 こうした状況で無限再帰を防ぐのは、トリガプログラマの責任です。
トリガが定義される時、そのトリガ用の引数を指定することができます。 トリガ定義に引数を含めた目的は、似たような要求の異なるトリガに同じ関数を呼び出すことができるようにすることです。 例えば、2つの列名を引数とし、片方に現在のユーザをもう片方に現在のタイムスタンプをとる、汎化トリガ関数があるとします。 適切に作成すれば、この関数が特定のトリガの発行元となるテーブルに依存することはないでしょう。 同じ関数を使用して、例えば、トランザクションテーブルに作成記録を自動的に登録させるために、適切な列を持つ任意のテーブルのINSERTイベントに使用することができます。 また、UPDATEとして定義すれば、最終更新イベントを追跡するために使用することも可能です。