create_trigger.sgml 9.9 KB
Newer Older
1
<!--
P
Peter Eisentraut 已提交
2
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_trigger.sgml,v 1.29 2002/11/21 23:34:43 petere Exp $
3
PostgreSQL documentation
4 5
-->

6 7
<refentry id="SQL-CREATETRIGGER">
 <refmeta>
8
  <refentrytitle id="SQL-CREATETRIGGER-TITLE">CREATE TRIGGER</refentrytitle>
9 10 11 12
  <refmiscinfo>SQL - Language Statements</refmiscinfo>
 </refmeta>
 <refnamediv>
  <refname>
13
   CREATE TRIGGER
14 15
  </refname>
  <refpurpose>
16
   define a new trigger
17
  </refpurpose>
18
 </refnamediv>
19 20
 <refsynopsisdiv>
  <refsynopsisdivinfo>
21
   <date>2000-03-25</date>
22 23 24 25
  </refsynopsisdivinfo>
  <synopsis>
CREATE TRIGGER <replaceable class="PARAMETER">name</replaceable> { BEFORE | AFTER } { <replaceable class="PARAMETER">event</replaceable> [OR ...] }
    ON <replaceable class="PARAMETER">table</replaceable> FOR EACH { ROW | STATEMENT }
B
Bruce Momjian 已提交
26
    EXECUTE PROCEDURE <replaceable class="PARAMETER">func</replaceable> ( <replaceable class="PARAMETER">arguments</replaceable> )
27
  </synopsis>
28
  
29 30 31 32 33
  <refsect2 id="R2-SQL-CREATETRIGGER-1">
   <refsect2info>
    <date>1998-09-21</date>
   </refsect2info>
   <title>
34
    Inputs
35 36 37 38 39 40 41 42
   </title>
   <para>

    <variablelist>
     <varlistentry>
      <term><replaceable class="parameter">name</replaceable></term>
      <listitem>
       <para>
43 44
	The name to give the new trigger.  This must be distinct from the name
	of any other trigger for the same table.
45 46 47 48
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
49
      <term><replaceable class="parameter">event</replaceable></term>
50 51
      <listitem>
       <para>
52
	One of INSERT, DELETE or UPDATE.
53 54 55 56
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
57
      <term><replaceable class="parameter">table</replaceable></term>
58 59
      <listitem>
       <para>
60
	The name (optionally schema-qualified) of the table the trigger is for.
61 62 63 64
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
65
      <term><replaceable class="parameter">func</replaceable></term>
66 67
      <listitem>
       <para>
68
	A user-supplied function that is declared as taking no arguments
69
	and returning type <literal>trigger</>.
70 71 72 73 74 75 76 77 78 79 80 81
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="parameter">arguments</replaceable></term>
      <listitem>
       <para>
        An optional comma-separated list of arguments to be provided to the
	function when the trigger is executed, along with the standard trigger
	data such as old and new tuple contents.  The arguments are literal
	string constants.  Simple names and numeric constants may be written
	here too, but they will all be converted to strings.
82 83 84 85 86 87 88 89 90 91 92 93
       </para>
      </listitem>
     </varlistentry>
    </variablelist>
   </para>
  </refsect2>

  <refsect2 id="R2-SQL-CREATETRIGGER-2">
   <refsect2info>
    <date>1998-09-21</date>
   </refsect2info>
   <title>
94
    Outputs
95 96 97 98 99 100
   </title>
   <para>

    <variablelist>
     <varlistentry>
      <term><computeroutput>
101
CREATE TRIGGER
102 103 104 105
       </computeroutput></term>
      <listitem>
       <para>
	This message is returned if the trigger is successfully created.
106 107 108
       </para>
      </listitem>
     </varlistentry>
109
    </variablelist>
110
   </para>
111 112
  </refsect2>
 </refsynopsisdiv>
113
 
114 115 116 117 118
 <refsect1 id="R1-SQL-CREATETRIGGER-1">
  <refsect1info>
   <date>1998-09-21</date>
  </refsect1info>
  <title>
119
   Description
120
  </title>
121

122
  <para>
T
Thomas G. Lockhart 已提交
123
   <command>CREATE TRIGGER</command> will enter a new trigger into the current
124
   data base.  The trigger will be associated with the relation
125 126
   <replaceable class="parameter">table</replaceable> and will execute
   the specified function <replaceable class="parameter">func</replaceable>.
127
  </para>
128

129
  <para>
B
Bruce Momjian 已提交
130 131 132 133 134 135 136 137 138 139 140 141 142
   The trigger can be specified to fire either before BEFORE the
   operation is attempted on a tuple (before constraints are checked and
   the <command>INSERT</command>, <command>UPDATE</command> or
   <command>DELETE</command> is attempted) or AFTER the operation has
   been attempted (e.g., after constraints are checked and the
   <command>INSERT</command>, <command>UPDATE</command> or
   <command>DELETE</command> has completed). If the trigger fires before
   the event, the trigger may skip the operation for the current tuple,
   or change the tuple being inserted (for <command>INSERT</command> and
   <command>UPDATE</command> operations only). If the trigger fires
   after the event, all changes, including the last insertion, update,
   or deletion, are <quote>visible</quote> to the trigger.
  </para>
143 144 145 146 147 148

  <para>
   If multiple triggers of the same kind are defined for the same event,
   they will be fired in alphabetical order by name.
  </para>

B
Bruce Momjian 已提交
149 150
  <para>
  <command>SELECT</command> does not modify any rows so you can not
151 152
  create <command>SELECT</command> triggers. Rules and views are more
  appropriate in such cases.
153
  </para>
154

155
  <para>
T
Thomas G. Lockhart 已提交
156
   Refer to the chapters on SPI and Triggers in the
157
   <citetitle>PostgreSQL Programmer's Guide</citetitle>  for  more
158
   information.
159
  </para>
160
 </refsect1>
161

162 163 164 165 166 167 168 169
 <refsect1 id="SQL-CREATETRIGGER-notes">
  <title>Notes</title>

  <para>
   To create a trigger on a table, the user must have the
   <literal>TRIGGER</literal> privilege on the table.
  </para>

170 171 172
  <para>
   In <productname>PostgreSQL</productname> versions before 7.3, it was
   necessary to declare trigger functions as returning the placeholder
173 174 175 176
   type <type>opaque</>, rather than <type>trigger</>.  To support loading
   of old dump files, <command>CREATE TRIGGER</> will accept a function
   declared as returning <type>opaque</>, but it will issue a NOTICE and
   change the function's declared return type to <type>trigger</>.
177 178
  </para>

179 180 181 182 183
  <para>
   As of the current release, <literal>STATEMENT</literal> triggers are not implemented.
  </para>

  <para>
P
Peter Eisentraut 已提交
184
   Refer to the <xref linkend="sql-droptrigger" endterm="sql-droptrigger-title"> command for
185 186
   information on how to remove triggers.
  </para>
187 188
 </refsect1>

189
 <refsect1 id="R1-SQL-CREATETRIGGER-2">
190 191
  <title>Examples</title>

192
  <para>
193 194
   Check if the specified distributor code exists in the distributors
   table before appending or updating a row in the table films:
195

196
<programlisting>
197 198 199
CREATE TRIGGER if_dist_exists
    BEFORE INSERT OR UPDATE ON films FOR EACH ROW
    EXECUTE PROCEDURE check_primary_key ('did', 'distributors', 'did');
200
</programlisting>
201
  </para>
202

203
  <para>
204 205
   Before cancelling a distributor or updating its code, remove every
   reference to the table films:
206
<programlisting>
207 208 209
CREATE TRIGGER if_film_exists 
    BEFORE DELETE OR UPDATE ON distributors FOR EACH ROW
    EXECUTE PROCEDURE check_foreign_key (1, 'CASCADE', 'did', 'films', 'did');
210
</programlisting>
211
  </para>
212

213 214 215
  <para>
   The second example can also be done by using a foreign key,
   constraint as in:
216

217
<programlisting>
218
CREATE TABLE distributors (
T
Thomas G. Lockhart 已提交
219 220 221
    did      DECIMAL(3),
    name     VARCHAR(40),
    CONSTRAINT if_film_exists
222 223
    FOREIGN KEY(did) REFERENCES films
    ON UPDATE CASCADE ON DELETE CASCADE  
224
);
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
</programlisting>
  </para>
 </refsect1>

 <refsect1 id="SQL-CREATETRIGGER-compatibility">
  <title>Compatibility</title>
  
  <variablelist>
   <varlistentry>
    <term>SQL92</term>
    <listitem>
     <para>
      There is no <command>CREATE TRIGGER</command> statement in <acronym>SQL92</acronym>.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term>SQL99</term>
    <listitem>
     <para>
      The <command>CREATE TRIGGER</command> statement in
      <productname>PostgreSQL</productname> implements a subset of the
      SQL99 standard.  The following functionality is missing:
      <itemizedlist>
       <listitem>
        <para>
         SQL99 allows triggers to fire on updates to specific columns
         (e.g., <literal>AFTER UPDATE OF col1, col2</literal>).
        </para>
       </listitem>

       <listitem>
        <para>
         SQL99 allows you to define aliases for the <quote>old</quote>
P
Peter Eisentraut 已提交
260
         and <quote>new</quote> rows or tables for use in the definition
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
         of the triggered action (e.g., <literal>CREATE TRIGGER ... ON
         tablename REFERENCING OLD ROW AS somename NEW ROW AS
         othername ...</literal>).  Since
         <productname>PostgreSQL</productname> allows trigger
         procedures to be written in any number of user-defined
         languages, access to the data is handled in a
         language-specific way.
        </para>
       </listitem>

       <listitem>
        <para>
         <productname>PostgreSQL</productname> only has row-level
         triggers, no statement-level triggers.
        </para>
       </listitem>

       <listitem>
        <para>
         <productname>PostgreSQL</productname> only allows the
         execution of a stored procedure for the triggered action.
         SQL99 allows the execution of a number of other SQL commands,
         such as <command>CREATE TABLE</command> as triggered action.
         This limitation is not hard to work around by creating a
         stored procedure that executes these commands.
        </para>
       </listitem>
      </itemizedlist>
     </para>
290 291 292 293 294 295

     <para>
      SQL99 specifies that multiple triggers should be fired in
      time-of-creation order.  <productname>PostgreSQL</productname>
      uses name order, which was judged more convenient to work with.
     </para>
296 297 298 299 300 301 302 303 304
    </listitem>
   </varlistentry>
  </variablelist>
 </refsect1>

 <refsect1>
  <title>See Also</title>

  <simplelist type="inline">
P
Peter Eisentraut 已提交
305 306 307
   <member><xref linkend="sql-createfunction" endterm="sql-createfunction-title"></member>
   <member><xref linkend="sql-altertrigger" endterm="sql-altertrigger-title"></member>
   <member><xref linkend="sql-droptrigger" endterm="sql-droptrigger-title"></member>
308 309
   <member><citetitle>PostgreSQL Programmer's Guide</citetitle></member>
  </simplelist>
310
 </refsect1>
311
</refentry>
312 313 314 315

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
316
sgml-omittag:nil
317 318 319 320 321 322 323 324 325 326 327
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"../reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/catalog"
sgml-local-ecat-files:nil
End:
328
-->