gooderp18绿色标准版
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

277 行
9.4KB

  1. /*-------------------------------------------------------------------------
  2. *
  3. * trigger.h
  4. * Declarations for trigger handling.
  5. *
  6. * Portions Copyright (c) 1996-2019, 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. TupleTableSlot *tg_trigslot;
  34. TupleTableSlot *tg_newslot;
  35. Tuplestorestate *tg_oldtable;
  36. Tuplestorestate *tg_newtable;
  37. } TriggerData;
  38. /*
  39. * The state for capturing old and new tuples into transition tables for a
  40. * single ModifyTable node (or other operation source, e.g. copy.c).
  41. *
  42. * This is per-caller to avoid conflicts in setting tcs_map or
  43. * tcs_original_insert_tuple. Note, however, that the pointed-to
  44. * private data may be shared across multiple callers.
  45. */
  46. struct AfterTriggersTableData; /* private in trigger.c */
  47. typedef struct TransitionCaptureState
  48. {
  49. /*
  50. * Is there at least one trigger specifying each transition relation on
  51. * the relation explicitly named in the DML statement or COPY command?
  52. * Note: in current usage, these flags could be part of the private state,
  53. * but it seems possibly useful to let callers see them.
  54. */
  55. bool tcs_delete_old_table;
  56. bool tcs_update_old_table;
  57. bool tcs_update_new_table;
  58. bool tcs_insert_new_table;
  59. /*
  60. * For UPDATE and DELETE, AfterTriggerSaveEvent may need to convert the
  61. * new and old tuples from a child table's format to the format of the
  62. * relation named in a query so that it is compatible with the transition
  63. * tuplestores. The caller must store the conversion map here if so.
  64. */
  65. TupleConversionMap *tcs_map;
  66. /*
  67. * For INSERT and COPY, it would be wasteful to convert tuples from child
  68. * format to parent format after they have already been converted in the
  69. * opposite direction during routing. In that case we bypass conversion
  70. * and allow the inserting code (copy.c and nodeModifyTable.c) to provide
  71. * a slot containing the original tuple directly.
  72. */
  73. TupleTableSlot *tcs_original_insert_tuple;
  74. /*
  75. * Private data including the tuplestore(s) into which to insert tuples.
  76. */
  77. struct AfterTriggersTableData *tcs_private;
  78. } TransitionCaptureState;
  79. /*
  80. * TriggerEvent bit flags
  81. *
  82. * Note that we assume different event types (INSERT/DELETE/UPDATE/TRUNCATE)
  83. * can't be OR'd together in a single TriggerEvent. This is unlike the
  84. * situation for pg_trigger rows, so pg_trigger.tgtype uses a different
  85. * representation!
  86. */
  87. #define TRIGGER_EVENT_INSERT 0x00000000
  88. #define TRIGGER_EVENT_DELETE 0x00000001
  89. #define TRIGGER_EVENT_UPDATE 0x00000002
  90. #define TRIGGER_EVENT_TRUNCATE 0x00000003
  91. #define TRIGGER_EVENT_OPMASK 0x00000003
  92. #define TRIGGER_EVENT_ROW 0x00000004
  93. #define TRIGGER_EVENT_BEFORE 0x00000008
  94. #define TRIGGER_EVENT_AFTER 0x00000000
  95. #define TRIGGER_EVENT_INSTEAD 0x00000010
  96. #define TRIGGER_EVENT_TIMINGMASK 0x00000018
  97. /* More TriggerEvent flags, used only within trigger.c */
  98. #define AFTER_TRIGGER_DEFERRABLE 0x00000020
  99. #define AFTER_TRIGGER_INITDEFERRED 0x00000040
  100. #define TRIGGER_FIRED_BY_INSERT(event) \
  101. (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_INSERT)
  102. #define TRIGGER_FIRED_BY_DELETE(event) \
  103. (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_DELETE)
  104. #define TRIGGER_FIRED_BY_UPDATE(event) \
  105. (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_UPDATE)
  106. #define TRIGGER_FIRED_BY_TRUNCATE(event) \
  107. (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_TRUNCATE)
  108. #define TRIGGER_FIRED_FOR_ROW(event) \
  109. ((event) & TRIGGER_EVENT_ROW)
  110. #define TRIGGER_FIRED_FOR_STATEMENT(event) \
  111. (!TRIGGER_FIRED_FOR_ROW(event))
  112. #define TRIGGER_FIRED_BEFORE(event) \
  113. (((event) & TRIGGER_EVENT_TIMINGMASK) == TRIGGER_EVENT_BEFORE)
  114. #define TRIGGER_FIRED_AFTER(event) \
  115. (((event) & TRIGGER_EVENT_TIMINGMASK) == TRIGGER_EVENT_AFTER)
  116. #define TRIGGER_FIRED_INSTEAD(event) \
  117. (((event) & TRIGGER_EVENT_TIMINGMASK) == TRIGGER_EVENT_INSTEAD)
  118. /*
  119. * Definitions for replication role based firing.
  120. */
  121. #define SESSION_REPLICATION_ROLE_ORIGIN 0
  122. #define SESSION_REPLICATION_ROLE_REPLICA 1
  123. #define SESSION_REPLICATION_ROLE_LOCAL 2
  124. extern PGDLLIMPORT int SessionReplicationRole;
  125. /*
  126. * States at which a trigger can be fired. These are the
  127. * possible values for pg_trigger.tgenabled.
  128. */
  129. #define TRIGGER_FIRES_ON_ORIGIN 'O'
  130. #define TRIGGER_FIRES_ALWAYS 'A'
  131. #define TRIGGER_FIRES_ON_REPLICA 'R'
  132. #define TRIGGER_DISABLED 'D'
  133. extern ObjectAddress CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
  134. Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid,
  135. Oid funcoid, Oid parentTriggerOid, Node *whenClause,
  136. bool isInternal, bool in_partition);
  137. extern void RemoveTriggerById(Oid trigOid);
  138. extern Oid get_trigger_oid(Oid relid, const char *name, bool missing_ok);
  139. extern ObjectAddress renametrig(RenameStmt *stmt);
  140. extern void EnableDisableTrigger(Relation rel, const char *tgname,
  141. char fires_when, bool skip_system, LOCKMODE lockmode);
  142. extern void RelationBuildTriggers(Relation relation);
  143. extern TriggerDesc *CopyTriggerDesc(TriggerDesc *trigdesc);
  144. extern const char *FindTriggerIncompatibleWithInheritance(TriggerDesc *trigdesc);
  145. extern TransitionCaptureState *MakeTransitionCaptureState(TriggerDesc *trigdesc,
  146. Oid relid, CmdType cmdType);
  147. extern void FreeTriggerDesc(TriggerDesc *trigdesc);
  148. extern void ExecBSInsertTriggers(EState *estate,
  149. ResultRelInfo *relinfo);
  150. extern void ExecASInsertTriggers(EState *estate,
  151. ResultRelInfo *relinfo,
  152. TransitionCaptureState *transition_capture);
  153. extern bool ExecBRInsertTriggers(EState *estate,
  154. ResultRelInfo *relinfo,
  155. TupleTableSlot *slot);
  156. extern void ExecARInsertTriggers(EState *estate,
  157. ResultRelInfo *relinfo,
  158. TupleTableSlot *slot,
  159. List *recheckIndexes,
  160. TransitionCaptureState *transition_capture);
  161. extern bool ExecIRInsertTriggers(EState *estate,
  162. ResultRelInfo *relinfo,
  163. TupleTableSlot *slot);
  164. extern void ExecBSDeleteTriggers(EState *estate,
  165. ResultRelInfo *relinfo);
  166. extern void ExecASDeleteTriggers(EState *estate,
  167. ResultRelInfo *relinfo,
  168. TransitionCaptureState *transition_capture);
  169. extern bool ExecBRDeleteTriggers(EState *estate,
  170. EPQState *epqstate,
  171. ResultRelInfo *relinfo,
  172. ItemPointer tupleid,
  173. HeapTuple fdw_trigtuple,
  174. TupleTableSlot **epqslot);
  175. extern void ExecARDeleteTriggers(EState *estate,
  176. ResultRelInfo *relinfo,
  177. ItemPointer tupleid,
  178. HeapTuple fdw_trigtuple,
  179. TransitionCaptureState *transition_capture);
  180. extern bool ExecIRDeleteTriggers(EState *estate,
  181. ResultRelInfo *relinfo,
  182. HeapTuple trigtuple);
  183. extern void ExecBSUpdateTriggers(EState *estate,
  184. ResultRelInfo *relinfo);
  185. extern void ExecASUpdateTriggers(EState *estate,
  186. ResultRelInfo *relinfo,
  187. TransitionCaptureState *transition_capture);
  188. extern bool ExecBRUpdateTriggers(EState *estate,
  189. EPQState *epqstate,
  190. ResultRelInfo *relinfo,
  191. ItemPointer tupleid,
  192. HeapTuple fdw_trigtuple,
  193. TupleTableSlot *slot);
  194. extern void ExecARUpdateTriggers(EState *estate,
  195. ResultRelInfo *relinfo,
  196. ItemPointer tupleid,
  197. HeapTuple fdw_trigtuple,
  198. TupleTableSlot *slot,
  199. List *recheckIndexes,
  200. TransitionCaptureState *transition_capture);
  201. extern bool ExecIRUpdateTriggers(EState *estate,
  202. ResultRelInfo *relinfo,
  203. HeapTuple trigtuple,
  204. TupleTableSlot *slot);
  205. extern void ExecBSTruncateTriggers(EState *estate,
  206. ResultRelInfo *relinfo);
  207. extern void ExecASTruncateTriggers(EState *estate,
  208. ResultRelInfo *relinfo);
  209. extern void AfterTriggerBeginXact(void);
  210. extern void AfterTriggerBeginQuery(void);
  211. extern void AfterTriggerEndQuery(EState *estate);
  212. extern void AfterTriggerFireDeferred(void);
  213. extern void AfterTriggerEndXact(bool isCommit);
  214. extern void AfterTriggerBeginSubXact(void);
  215. extern void AfterTriggerEndSubXact(bool isCommit);
  216. extern void AfterTriggerSetState(ConstraintsSetStmt *stmt);
  217. extern bool AfterTriggerPendingOnRel(Oid relid);
  218. /*
  219. * in utils/adt/ri_triggers.c
  220. */
  221. extern bool RI_FKey_pk_upd_check_required(Trigger *trigger, Relation pk_rel,
  222. TupleTableSlot *old_slot, TupleTableSlot *new_slot);
  223. extern bool RI_FKey_fk_upd_check_required(Trigger *trigger, Relation fk_rel,
  224. TupleTableSlot *old_slot, TupleTableSlot *new_slot);
  225. extern bool RI_Initial_Check(Trigger *trigger,
  226. Relation fk_rel, Relation pk_rel);
  227. extern void RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel,
  228. Relation pk_rel);
  229. /* result values for RI_FKey_trigger_type: */
  230. #define RI_TRIGGER_PK 1 /* is a trigger on the PK relation */
  231. #define RI_TRIGGER_FK 2 /* is a trigger on the FK relation */
  232. #define RI_TRIGGER_NONE 0 /* is not an RI trigger function */
  233. extern int RI_FKey_trigger_type(Oid tgfoid);
  234. #endif /* TRIGGER_H */
上海开阖软件有限公司 沪ICP备12045867号-1