★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

40.3. C言語によるイベントトリガ関数の書き方

本節ではトリガ関数とのインタフェースについて低レベルな詳細を説明します。 この情報はC言語でトリガ関数を作成する時にのみ必要です。 高レベルな言語で作成すれば、こうした詳細は代わりに扱ってもらえます。 たいていの場合、Cでトリガを作成する前に手続き言語を使用することを検討すべきです。 各手続き言語の文書で、その言語を使用したイベントトリガの作成方法を説明します。

トリガ関数はversion 1関数マネージャインタフェースを使わなくてはいけません。

関数がイベントトリガマネージャから呼び出される時は、通常の引数が渡されるのではなく、EventTriggerData構造体を指すcontextポインタが渡されます。 C関数は、イベントトリガマネージャから呼び出されたのかどうかを以下のマクロを実行することで検査することができます。

CALLED_AS_EVENT_TRIGGER(fcinfo)

これは以下に展開されます。

((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))

もしこれが真を返す場合、fcinfo->contextEventTriggerData *型にキャストし、指されたEventTriggerData構造体を使用することは安全です。 その関数は、TriggerData構造体やそれが指すどのようなデータも変更してはいけません

struct EventTriggerDatacommands/event_trigger.hの中で定義されています。

typedef struct EventTriggerData
{
    NodeTag     type;

    const char *event;      /* イベント名 */
    Node       *parsetree;  /* 解析ツリー */
    CommandTag  tag;        /* コマンドタグ */
} EventTriggerData;

メンバは下記のように定義されています。

type

常にT_EventTriggerDataです。

event

その関数が呼び出されたイベント、"ddl_command_start""ddl_command_end""sql_drop""table_rewrite"のうちの1つを記述します。 これらのイベントの内容は、40.1を参照してください。

parsetree

コマンドの解析ツリーへのポインタです。 詳細はPostgreSQLのソースコードを確認してください。 解析ツリーの構造は予告なく変更されることがあります。

tag

イベントトリガの実行対象となるイベントに関連するコマンドタグです。たとえば、"CREATE FUNCTION"です。

イベントトリガ関数はNULLポインタ(SQLのNULLではありません。したがって、isNullは真にはなりません)を返さなければなりません。