<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/create_constraint.sgml,v 1.22 2010/04/03 07:22:58 petere Exp $
PostgreSQL documentation
-->

<refentry id="SQL-CREATECONSTRAINT">
 <refmeta>
  <refentrytitle>CREATE CONSTRAINT TRIGGER</refentrytitle>
  <manvolnum>7</manvolnum>
  <refmiscinfo>SQL - Language Statements</refmiscinfo>
 </refmeta>

 <refnamediv>
  <refname>CREATE CONSTRAINT TRIGGER</refname>
  <refpurpose>define a new constraint trigger</refpurpose>
 </refnamediv>

 <indexterm zone="sql-createconstraint">
  <primary>CREATE CONSTRAINT TRIGGER</primary>
 </indexterm>

 <refsynopsisdiv>
<synopsis>
CREATE CONSTRAINT TRIGGER <replaceable class="parameter">name</replaceable>
    AFTER <replaceable class="parameter">event</replaceable> [ OR ... ]
    ON <replaceable class="parameter">table_name</replaceable>
    [ FROM <replaceable class="parameter">referenced_table_name</replaceable> ]
    { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } }
    FOR EACH ROW
    [ WHEN ( <replaceable class="parameter">condition</replaceable> ) ]
    EXECUTE PROCEDURE <replaceable class="parameter">function_name</replaceable> ( <replaceable class="parameter">arguments</replaceable> )
</synopsis>
 </refsynopsisdiv>

 <refsect1>
  <title>Description</title>

  <para>
   <command>CREATE CONSTRAINT TRIGGER</command> creates a
   <firstterm>constraint trigger</>.  This is the same as a regular trigger
   except that the timing of the trigger firing can be adjusted using
   <xref linkend="SQL-SET-CONSTRAINTS">.
   Constraint triggers must be <literal>AFTER ROW</> triggers.  They can
   be fired either at the end of the statement causing the triggering event,
   or at the end of the containing transaction; in the latter case they are
   said to be <firstterm>deferred</>.  A pending deferred-trigger firing can
   also be forced to happen immediately by using <command>SET CONSTRAINTS</>.
  </para>
 </refsect1>

 <refsect1>
  <title>Parameters</title>

  <variablelist>
   <varlistentry>
    <term><replaceable class="PARAMETER">name</replaceable></term>
    <listitem>
     <para>
      The name of the constraint trigger.  This is also the name to use
      when modifying the trigger's behavior using <command>SET CONSTRAINTS</>.
      The name cannot be schema-qualified &mdash; the trigger inherits the
      schema of its table.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="PARAMETER">event</replaceable></term>
    <listitem>
     <para>
      One of <literal>INSERT</literal>, <literal>UPDATE</literal>, or
      <literal>DELETE</literal>; this specifies the event that will fire the
      trigger. Multiple events can be specified using <literal>OR</literal>.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="PARAMETER">table_name</replaceable></term>
    <listitem>
     <para>
      The (possibly schema-qualified) name of the table in which
      the triggering events occur.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="PARAMETER">referenced_table_name</replaceable></term>
    <listitem>
     <para>
      The (possibly schema-qualified) name of another table referenced by the
      constraint.  This option is used for foreign-key constraints and is not
      recommended for general use.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><literal>DEFERRABLE</literal></term>
    <term><literal>NOT DEFERRABLE</literal></term>
    <term><literal>INITIALLY IMMEDIATE</literal></term>
    <term><literal>INITIALLY DEFERRED</literal></term>
    <listitem>
     <para>
      The default timing of the trigger.
      See the <xref linkend="SQL-CREATETABLE">
      documentation for details of these constraint options.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="parameter">condition</replaceable></term>
    <listitem>
     <para>
      A Boolean expression that determines whether the trigger function
      will actually be executed.  This acts the same as in <xref
      linkend="SQL-CREATETRIGGER">.
      Note in particular that evaluation of the <literal>WHEN</>
      condition is not deferred, but occurs immediately after the row
      update operation is performed.  If the condition does not evaluate
      to <literal>true</> then the trigger is not queued for deferred
      execution.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="PARAMETER">function_name</replaceable></term>
    <listitem>
     <para>
      The function to call when the trigger is fired. See <xref
      linkend="SQL-CREATETRIGGER"> for
      details.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="PARAMETER">arguments</replaceable></term>
    <listitem>
     <para>
      Optional argument strings to pass to the trigger function. See <xref
      linkend="SQL-CREATETRIGGER"> for
      details.
     </para>
    </listitem>
   </varlistentry>
  </variablelist>
  </refsect1>

 <refsect1>
  <title>Compatibility</title>
  <para>
   <command>CREATE CONSTRAINT TRIGGER</command> is a
   <productname>PostgreSQL</productname> extension of the <acronym>SQL</>
   standard.
  </para>
 </refsect1>

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

  <simplelist type="inline">
   <member><xref linkend="sql-createtrigger"></member>
   <member><xref linkend="sql-droptrigger"></member>
   <member><xref linkend="sql-set-constraints"></member>
  </simplelist>
 </refsect1>
</refentry>
