gooderp18绿色标准版
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

77 linhas
5.0KB

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>39.4. A Complete Event Trigger Example</title><link rel="stylesheet" type="text/css" href="stylesheet.css" /><link rev="made" href="pgsql-docs@lists.postgresql.org" /><meta name="generator" content="DocBook XSL Stylesheets V1.79.1" /><link rel="prev" href="event-trigger-interface.html" title="39.3. Writing Event Trigger Functions in C" /><link rel="next" href="event-trigger-table-rewrite-example.html" title="39.5. A Table Rewrite Event Trigger Example" /></head><body><div xmlns="http://www.w3.org/TR/xhtml1/transitional" class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="5" align="center">39.4. A Complete Event Trigger Example</th></tr><tr><td width="10%" align="left"><a accesskey="p" href="event-trigger-interface.html" title="39.3. Writing Event Trigger Functions in C">Prev</a> </td><td width="10%" align="left"><a accesskey="u" href="event-triggers.html" title="Chapter 39. Event Triggers">Up</a></td><th width="60%" align="center">Chapter 39. Event Triggers</th><td width="10%" align="right"><a accesskey="h" href="index.html" title="PostgreSQL 12.4 Documentation">Home</a></td><td width="10%" align="right"> <a accesskey="n" href="event-trigger-table-rewrite-example.html" title="39.5. A Table Rewrite Event Trigger Example">Next</a></td></tr></table><hr></hr></div><div class="sect1" id="EVENT-TRIGGER-EXAMPLE"><div class="titlepage"><div><div><h2 class="title" style="clear: both">39.4. A Complete Event Trigger Example</h2></div></div></div><p>
  3. Here is a very simple example of an event trigger function written in C.
  4. (Examples of triggers written in procedural languages can be found in
  5. the documentation of the procedural languages.)
  6. </p><p>
  7. The function <code class="function">noddl</code> raises an exception each time it is called.
  8. The event trigger definition associated the function with
  9. the <code class="literal">ddl_command_start</code> event. The effect is that all DDL
  10. commands (with the exceptions mentioned
  11. in <a class="xref" href="event-trigger-definition.html" title="39.1. Overview of Event Trigger Behavior">Section 39.1</a>) are prevented from running.
  12. </p><p>
  13. This is the source code of the trigger function:
  14. </p><pre class="programlisting">
  15. #include "postgres.h"
  16. #include "commands/event_trigger.h"
  17. PG_MODULE_MAGIC;
  18. PG_FUNCTION_INFO_V1(noddl);
  19. Datum
  20. noddl(PG_FUNCTION_ARGS)
  21. {
  22. EventTriggerData *trigdata;
  23. if (!CALLED_AS_EVENT_TRIGGER(fcinfo)) /* internal error */
  24. elog(ERROR, "not fired by event trigger manager");
  25. trigdata = (EventTriggerData *) fcinfo-&gt;context;
  26. ereport(ERROR,
  27. (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
  28. errmsg("command \"%s\" denied", trigdata-&gt;tag)));
  29. PG_RETURN_NULL();
  30. }
  31. </pre><p>
  32. </p><p>
  33. After you have compiled the source code (see <a class="xref" href="xfunc-c.html#DFUNC" title="37.10.5. Compiling and Linking Dynamically-Loaded Functions">Section 37.10.5</a>),
  34. declare the function and the triggers:
  35. </p><pre class="programlisting">
  36. CREATE FUNCTION noddl() RETURNS event_trigger
  37. AS 'noddl' LANGUAGE C;
  38. CREATE EVENT TRIGGER noddl ON ddl_command_start
  39. EXECUTE FUNCTION noddl();
  40. </pre><p>
  41. </p><p>
  42. Now you can test the operation of the trigger:
  43. </p><pre class="screen">
  44. =# \dy
  45. List of event triggers
  46. Name | Event | Owner | Enabled | Function | Tags
  47. -------+-------------------+-------+---------+----------+------
  48. noddl | ddl_command_start | dim | enabled | noddl |
  49. (1 row)
  50. =# CREATE TABLE foo(id serial);
  51. ERROR: command "CREATE TABLE" denied
  52. </pre><p>
  53. </p><p>
  54. In this situation, in order to be able to run some DDL commands when you
  55. need to do so, you have to either drop the event trigger or disable it. It
  56. can be convenient to disable the trigger for only the duration of a
  57. transaction:
  58. </p><pre class="programlisting">
  59. BEGIN;
  60. ALTER EVENT TRIGGER noddl DISABLE;
  61. CREATE TABLE foo (id serial);
  62. ALTER EVENT TRIGGER noddl ENABLE;
  63. COMMIT;
  64. </pre><p>
  65. (Recall that DDL commands on event triggers themselves are not affected by
  66. event triggers.)
  67. </p></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="event-trigger-interface.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="event-triggers.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="event-trigger-table-rewrite-example.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">39.3. Writing Event Trigger Functions in C </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 39.5. A Table Rewrite Event Trigger Example</td></tr></table></div></body></html>
上海开阖软件有限公司 沪ICP备12045867号-1