39.3. 用 C 编写触发器函数

本节描述了触发功能的接口的底层细节。仅在用 C 编写触发器函数时才需要此信息。如果您使用高级语言,则将为您处理这些详细信息。在大多数情况下,您应该在使用 C 编写触发器之前考虑使用一种过程语言。每种过程语言的文档都说明了如何用该语言编写触发器。

触发功能必须使用“版本 1”功能 Management 器界面。

触发器 Management 器调用函数时,不会传递任何常规参数,而是会传递指向TriggerData结构的“上下文”指针。 C 函数可以通过执行宏来检查是否从触发器 Management 器中调用了它们:

CALLED_AS_TRIGGER(fcinfo)

扩展为:

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

如果返回 true,则可以安全地将fcinfo->context转换为TriggerData *并使用指向TriggerData的结构。该函数必须不得更改TriggerData结构或其指向的任何数据。

struct TriggerDatacommands/trigger.h中定义:

typedef struct TriggerData
{
    NodeTag          type;
    TriggerEvent     tg_event;
    Relation         tg_relation;
    HeapTuple        tg_trigtuple;
    HeapTuple        tg_newtuple;
    Trigger         *tg_trigger;
    Buffer           tg_trigtuplebuf;
    Buffer           tg_newtuplebuf;
    Tuplestorestate *tg_oldtable;
    Tuplestorestate *tg_newtable;
} TriggerData;

成员定义如下:

typedef struct Trigger
{
    Oid         tgoid;
    char       *tgname;
    Oid         tgfoid;
    int16       tgtype;
    char        tgenabled;
    bool        tgisinternal;
    Oid         tgconstrrelid;
    Oid         tgconstrindid;
    Oid         tgconstraint;
    bool        tgdeferrable;
    bool        tginitdeferred;
    int16       tgnargs;
    int16       tgnattr;
    int16      *tgattr;
    char      **tgargs;
    char       *tgqual;
    char       *tgoldtable;
    char       *tgnewtable;
} Trigger;

其中tgname是触发器的名称,tgnargstgargs中参数的数量,而tgargs是指向CREATE TRIGGER语句中指定的参数的指针的数组。其他成员仅供内部使用。

要允许通过 SPI 发出的查询引用过渡表,请参见SPI_register_trigger_data

触发器函数必须返回HeapTuple指针或NULL指针(不是 SQL 空值,即,不设置* isNull * true)。如果您不想修改正在操作的行,请小心地根据需要返回tg_trigtupletg_newtuple

上一章 首页 下一章