2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3

38.2. 用 C 語言編寫事件觸發器函式 #

本節描述了事件觸發器函式的介面的底層細節。這些資訊僅在用 C 語言編寫事件觸發器函式時才需要。如果您使用的是更高階的語言,那麼這些細節將由語言為您處理。在大多數情況下,您應該考慮使用過程語言,然後再用 C 語言編寫事件觸發器。每種過程語言的文件都解釋瞭如何用該語言編寫事件觸發器。

事件觸發器函式必須使用“version 1”函式管理器介面。

當函式被事件觸發器管理器呼叫時,它不會接收任何常規引數,而是接收一個指向 EventTriggerData 結構的“context”指標。C 函式可以透過執行以下宏來檢查它們是否被事件觸發器管理器呼叫:

CALLED_AS_EVENT_TRIGGER(fcinfo)

展開為

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

如果此值為真,則可以將 fcinfo->context 安全地轉換為 EventTriggerData * 型別,並使用指向的 EventTriggerData 結構。該函式不得更改 EventTriggerData 結構或其指向的任何資料。

struct EventTriggerData 定義在 commands/event_trigger.h

typedef struct EventTriggerData
{
    NodeTag     type;
    const char *event;      /* event name */
    Node       *parsetree;  /* parse tree */
    CommandTag  tag;        /* command tag */
} EventTriggerData;

成員定義如下:

type

始終為 T_EventTriggerData

event

描述呼叫函式的事件,這些事件包括 "login""ddl_command_start""ddl_command_end""sql_drop""table_rewrite"。有關這些事件的含義,請參閱 第 38.1 節

parsetree

指向命令的解析樹的指標。有關詳細資訊,請檢查 PostgreSQL 原始碼。解析樹結構可能會在不通知的情況下更改。

tag

與事件觸發器執行的事件相關的命令標籤,例如 "CREATE FUNCTION"

事件觸發器函式必須返回一個 NULL 指標(不是 SQL 的 null 值,即不要將 isNull 設定為 true)。

提交更正

如果您在文件中發現任何不正確的內容、與您對特定功能的實際體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。