trigger.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /*-------------------------------------------------------------------------
  2. *
  3. * trigger.h
  4. * Declarations for trigger handling.
  5. *
  6. * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
  7. * Portions Copyright (c) 1994, Regents of the University of California
  8. *
  9. * src/include/commands/trigger.h
  10. *
  11. *-------------------------------------------------------------------------
  12. */
  13. #ifndef TRIGGER_H
  14. #define TRIGGER_H
  15. #include "catalog/objectaddress.h"
  16. #include "nodes/execnodes.h"
  17. #include "nodes/parsenodes.h"
  18. /*
  19. * TriggerData is the node type that is passed as fmgr "context" info
  20. * when a function is called by the trigger manager.
  21. */
  22. #define CALLED_AS_TRIGGER(fcinfo) \
  23. ((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData))
  24. typedef uint32 TriggerEvent;
  25. typedef struct TriggerData
  26. {
  27. NodeTag type;
  28. TriggerEvent tg_event;
  29. Relation tg_relation;
  30. HeapTuple tg_trigtuple;
  31. HeapTuple tg_newtuple;
  32. Trigger *tg_trigger;
  33. Buffer tg_trigtuplebuf;
  34. Buffer tg_newtuplebuf;
  35. } TriggerData;
  36. /*
  37. * TriggerEvent bit flags
  38. *
  39. * Note that we assume different event types (INSERT/DELETE/UPDATE/TRUNCATE)
  40. * can't be OR'd together in a single TriggerEvent. This is unlike the
  41. * situation for pg_trigger rows, so pg_trigger.tgtype uses a different
  42. * representation!
  43. */
  44. #define TRIGGER_EVENT_INSERT 0x00000000
  45. #define TRIGGER_EVENT_DELETE 0x00000001
  46. #define TRIGGER_EVENT_UPDATE 0x00000002
  47. #define TRIGGER_EVENT_TRUNCATE 0x00000003
  48. #define TRIGGER_EVENT_OPMASK 0x00000003
  49. #define TRIGGER_EVENT_ROW 0x00000004
  50. #define TRIGGER_EVENT_BEFORE 0x00000008
  51. #define TRIGGER_EVENT_AFTER 0x00000000
  52. #define TRIGGER_EVENT_INSTEAD 0x00000010
  53. #define TRIGGER_EVENT_TIMINGMASK 0x00000018
  54. /* More TriggerEvent flags, used only within trigger.c */
  55. #define AFTER_TRIGGER_DEFERRABLE 0x00000020
  56. #define AFTER_TRIGGER_INITDEFERRED 0x00000040
  57. #define TRIGGER_FIRED_BY_INSERT(event) \
  58. (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_INSERT)
  59. #define TRIGGER_FIRED_BY_DELETE(event) \
  60. (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_DELETE)
  61. #define TRIGGER_FIRED_BY_UPDATE(event) \
  62. (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_UPDATE)
  63. #define TRIGGER_FIRED_BY_TRUNCATE(event) \
  64. (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_TRUNCATE)
  65. #define TRIGGER_FIRED_FOR_ROW(event) \
  66. ((event) & TRIGGER_EVENT_ROW)
  67. #define TRIGGER_FIRED_FOR_STATEMENT(event) \
  68. (!TRIGGER_FIRED_FOR_ROW(event))
  69. #define TRIGGER_FIRED_BEFORE(event) \
  70. (((event) & TRIGGER_EVENT_TIMINGMASK) == TRIGGER_EVENT_BEFORE)
  71. #define TRIGGER_FIRED_AFTER(event) \
  72. (((event) & TRIGGER_EVENT_TIMINGMASK) == TRIGGER_EVENT_AFTER)
  73. #define TRIGGER_FIRED_INSTEAD(event) \
  74. (((event) & TRIGGER_EVENT_TIMINGMASK) == TRIGGER_EVENT_INSTEAD)
  75. /*
  76. * Definitions for replication role based firing.
  77. */
  78. #define SESSION_REPLICATION_ROLE_ORIGIN 0
  79. #define SESSION_REPLICATION_ROLE_REPLICA 1
  80. #define SESSION_REPLICATION_ROLE_LOCAL 2
  81. extern PGDLLIMPORT int SessionReplicationRole;
  82. /*
  83. * States at which a trigger can be fired. These are the
  84. * possible values for pg_trigger.tgenabled.
  85. */
  86. #define TRIGGER_FIRES_ON_ORIGIN 'O'
  87. #define TRIGGER_FIRES_ALWAYS 'A'
  88. #define TRIGGER_FIRES_ON_REPLICA 'R'
  89. #define TRIGGER_DISABLED 'D'
  90. extern ObjectAddress CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
  91. Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid,
  92. bool isInternal);
  93. extern void RemoveTriggerById(Oid trigOid);
  94. extern Oid get_trigger_oid(Oid relid, const char *name, bool missing_ok);
  95. extern ObjectAddress renametrig(RenameStmt *stmt);
  96. extern void EnableDisableTrigger(Relation rel, const char *tgname,
  97. char fires_when, bool skip_system);
  98. extern void RelationBuildTriggers(Relation relation);
  99. extern TriggerDesc *CopyTriggerDesc(TriggerDesc *trigdesc);
  100. extern void FreeTriggerDesc(TriggerDesc *trigdesc);
  101. extern void ExecBSInsertTriggers(EState *estate,
  102. ResultRelInfo *relinfo);
  103. extern void ExecASInsertTriggers(EState *estate,
  104. ResultRelInfo *relinfo);
  105. extern TupleTableSlot *ExecBRInsertTriggers(EState *estate,
  106. ResultRelInfo *relinfo,
  107. TupleTableSlot *slot);
  108. extern void ExecARInsertTriggers(EState *estate,
  109. ResultRelInfo *relinfo,
  110. HeapTuple trigtuple,
  111. List *recheckIndexes);
  112. extern TupleTableSlot *ExecIRInsertTriggers(EState *estate,
  113. ResultRelInfo *relinfo,
  114. TupleTableSlot *slot);
  115. extern void ExecBSDeleteTriggers(EState *estate,
  116. ResultRelInfo *relinfo);
  117. extern void ExecASDeleteTriggers(EState *estate,
  118. ResultRelInfo *relinfo);
  119. extern bool ExecBRDeleteTriggers(EState *estate,
  120. EPQState *epqstate,
  121. ResultRelInfo *relinfo,
  122. ItemPointer tupleid,
  123. HeapTuple fdw_trigtuple);
  124. extern void ExecARDeleteTriggers(EState *estate,
  125. ResultRelInfo *relinfo,
  126. ItemPointer tupleid,
  127. HeapTuple fdw_trigtuple);
  128. extern bool ExecIRDeleteTriggers(EState *estate,
  129. ResultRelInfo *relinfo,
  130. HeapTuple trigtuple);
  131. extern void ExecBSUpdateTriggers(EState *estate,
  132. ResultRelInfo *relinfo);
  133. extern void ExecASUpdateTriggers(EState *estate,
  134. ResultRelInfo *relinfo);
  135. extern TupleTableSlot *ExecBRUpdateTriggers(EState *estate,
  136. EPQState *epqstate,
  137. ResultRelInfo *relinfo,
  138. ItemPointer tupleid,
  139. HeapTuple fdw_trigtuple,
  140. TupleTableSlot *slot);
  141. extern void ExecARUpdateTriggers(EState *estate,
  142. ResultRelInfo *relinfo,
  143. ItemPointer tupleid,
  144. HeapTuple fdw_trigtuple,
  145. HeapTuple newtuple,
  146. List *recheckIndexes);
  147. extern TupleTableSlot *ExecIRUpdateTriggers(EState *estate,
  148. ResultRelInfo *relinfo,
  149. HeapTuple trigtuple,
  150. TupleTableSlot *slot);
  151. extern void ExecBSTruncateTriggers(EState *estate,
  152. ResultRelInfo *relinfo);
  153. extern void ExecASTruncateTriggers(EState *estate,
  154. ResultRelInfo *relinfo);
  155. extern void AfterTriggerBeginXact(void);
  156. extern void AfterTriggerBeginQuery(void);
  157. extern void AfterTriggerEndQuery(EState *estate);
  158. extern void AfterTriggerFireDeferred(void);
  159. extern void AfterTriggerEndXact(bool isCommit);
  160. extern void AfterTriggerBeginSubXact(void);
  161. extern void AfterTriggerEndSubXact(bool isCommit);
  162. extern void AfterTriggerSetState(ConstraintsSetStmt *stmt);
  163. extern bool AfterTriggerPendingOnRel(Oid relid);
  164. /*
  165. * in utils/adt/ri_triggers.c
  166. */
  167. extern bool RI_FKey_pk_upd_check_required(Trigger *trigger, Relation pk_rel,
  168. HeapTuple old_row, HeapTuple new_row);
  169. extern bool RI_FKey_fk_upd_check_required(Trigger *trigger, Relation fk_rel,
  170. HeapTuple old_row, HeapTuple new_row);
  171. extern bool RI_Initial_Check(Trigger *trigger,
  172. Relation fk_rel, Relation pk_rel);
  173. /* result values for RI_FKey_trigger_type: */
  174. #define RI_TRIGGER_PK 1 /* is a trigger on the PK relation */
  175. #define RI_TRIGGER_FK 2 /* is a trigger on the FK relation */
  176. #define RI_TRIGGER_NONE 0 /* is not an RI trigger function */
  177. extern int RI_FKey_trigger_type(Oid tgfoid);
  178. extern Datum pg_trigger_depth(PG_FUNCTION_ARGS);
  179. #endif /* TRIGGER_H */