Movatterモバイル変換


[0]ホーム

URL:



Facebook
Postgres Pro
Facebook
Downloads
37.3. Writing Trigger Functions in C
Prev UpChapter 37. TriggersHome Next

37.3. Writing Trigger Functions in C

This section describes the low-level details of the interface to a trigger function. This information is only needed when writing trigger functions in C. If you are using a higher-level language then these details are handled for you. In most cases you should consider using a procedural language before writing your triggers in C. The documentation of each procedural language explains how to write a trigger in that language.

Trigger functions must use theversion 1 function manager interface.

When a function is called by the trigger manager, it is not passed any normal arguments, but it is passed acontext pointer pointing to aTriggerData structure. C functions can check whether they were called from the trigger manager or not by executing the macro:

CALLED_AS_TRIGGER(fcinfo)

which expands to:

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

If this returns true, then it is safe to castfcinfo->context to typeTriggerData * and make use of the pointed-toTriggerData structure. The function mustnot alter theTriggerData structure or any of the data it points to.

struct TriggerData is defined incommands/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;} TriggerData;

where the members are defined as follows:

type

AlwaysT_TriggerData.

tg_event

Describes the event for which the function is called. You can use the following macros to examinetg_event:

TRIGGER_FIRED_BEFORE(tg_event)

Returns true if the trigger fired before the operation.

TRIGGER_FIRED_AFTER(tg_event)

Returns true if the trigger fired after the operation.

TRIGGER_FIRED_INSTEAD(tg_event)

Returns true if the trigger fired instead of the operation.

TRIGGER_FIRED_FOR_ROW(tg_event)

Returns true if the trigger fired for a row-level event.

TRIGGER_FIRED_FOR_STATEMENT(tg_event)

Returns true if the trigger fired for a statement-level event.

TRIGGER_FIRED_BY_INSERT(tg_event)

Returns true if the trigger was fired by anINSERT command.

TRIGGER_FIRED_BY_UPDATE(tg_event)

Returns true if the trigger was fired by anUPDATE command.

TRIGGER_FIRED_BY_DELETE(tg_event)

Returns true if the trigger was fired by aDELETE command.

TRIGGER_FIRED_BY_TRUNCATE(tg_event)

Returns true if the trigger was fired by aTRUNCATE command.

tg_relation

A pointer to a structure describing the relation that the trigger fired for. Look atutils/rel.h for details about this structure. The most interesting things aretg_relation->rd_att (descriptor of the relation tuples) andtg_relation->rd_rel->relname (relation name; the type is notchar* butNameData; useSPI_getrelname(tg_relation) to get achar* if you need a copy of the name).

tg_trigtuple

A pointer to the row for which the trigger was fired. This is the row being inserted, updated, or deleted. If this trigger was fired for anINSERT orDELETE then this is what you should return from the function if you don't want to replace the row with a different one (in the case ofINSERT) or skip the operation. For triggers on foreign tables, values of system columns herein are unspecified.

tg_newtuple

A pointer to the new version of the row, if the trigger was fired for anUPDATE, andNULL if it is for anINSERT or aDELETE. This is what you have to return from the function if the event is anUPDATE and you don't want to replace this row by a different one or skip the operation. For triggers on foreign tables, values of system columns herein are unspecified.

tg_trigger

A pointer to a structure of typeTrigger, defined inutils/reltrigger.h:

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;} Trigger;

wheretgname is the trigger's name,tgnargs is the number of arguments intgargs, andtgargs is an array of pointers to the arguments specified in theCREATE TRIGGER statement. The other members are for internal use only.

tg_trigtuplebuf

The buffer containingtg_trigtuple, orInvalidBuffer if there is no such tuple or it is not stored in a disk buffer.

tg_newtuplebuf

The buffer containingtg_newtuple, orInvalidBuffer if there is no such tuple or it is not stored in a disk buffer.

A trigger function must return either aHeapTuple pointer or aNULL pointer (not an SQL null value, that is, do not setisNull true). Be careful to return eithertg_trigtuple ortg_newtuple, as appropriate, if you don't want to modify the row being operated on.


Prev Up Next
37.2. Visibility of Data Changes Home 37.4. A Complete Trigger Example
epubpdf
Go to PostgreSQL 9.6
By continuing to browse this website, you agree to the use of cookies. Go toPrivacy Policy.

[8]ページ先頭

©2009-2025 Movatter.jp