<!--
$Header: /usr/prj/pg/cvsroot/doc/doc/src/sgml/ref/create_trigger.sgml,v 1.4 2001/07/03 02:04:21 natsuyo Exp $
Postgres documentation
-->

<refentry id="SQL-CREATETRIGGER">
 <refmeta>
  <refentrytitle id="SQL-CREATETRIGGER-TITLE">
   CREATE TRIGGER
  </refentrytitle>
  <refmiscinfo>SQL<!-- Language Statements -->言語</refmiscinfo>
 </refmeta>
 <refnamediv>
  <refname>
   CREATE TRIGGER
  </refname>
  <refpurpose>
   <!-- Creates a new trigger -->新しいトリガを作成します。<indexterm><primary>CREATE TRIGGER</primary></indexterm><indexterm><primary>SQL</primary><secondary>CREATE TRIGGER</secondary></indexterm><indexterm><primary sortas="とりが">トリガ</primary><secondary sortas="さくせい">作成</secondary></indexterm>
  </refpurpose>
 </refnamediv>
 <refsynopsisdiv>
  <refsynopsisdivinfo>
   <date>2000-03-25</date>
  </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 }
    EXECUTE PROCEDURE <replaceable class="PARAMETER">func</replaceable> ( <replaceable class="PARAMETER">arguments</replaceable> )
</synopsis>
  
  <refsect2 id="R2-SQL-CREATETRIGGER-1">
   <refsect2info>
    <date>1998-09-21</date>
   </refsect2info>
   <title>
    <!-- Inputs -->入力
   </title>

    <variablelist>
     <varlistentry>
      <term><replaceable class="parameter">name</replaceable></term>
      <listitem>
       <para>
	<!-- The name of an existing trigger. -->
        既存のトリガの名前です。
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="parameter">table</replaceable></term>
      <listitem>
       <para>
	<!-- The name of a table. -->
        テーブルの名前です。
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="parameter">event</replaceable></term>
      <listitem>
       <para>
	<!-- One of INSERT, DELETE or UPDATE. -->
        INSERT、DELETE、UPDATEのどれかです。

       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="parameter">func</replaceable></term>
      <listitem>
       <para>
	<!-- A user-supplied function. -->
        ユーザーが提供する関数です。
       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </refsect2>

  <refsect2 id="R2-SQL-CREATETRIGGER-2">
   <refsect2info>
    <date>1998-09-21</date>
   </refsect2info>
   <title>
    <!-- Outputs -->出力
   </title>

    <variablelist>
     <varlistentry>
      <term><computeroutput>
CREATE
       </computeroutput></term>
      <listitem>
       <para>
        <!-- 
	This message is returned if the trigger is successfully created.
        -->

        トリガの作成に成功するとこのメッセージが返されます。

       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </refsect2>
 </refsynopsisdiv>
 
 <refsect1 id="R1-SQL-CREATETRIGGER-1">
  <refsect1info>
   <date>1998-09-21</date>
  </refsect1info>
  <title>
   <!-- Description -->説明
  </title>

  <para>
   <!-- 
   <command>CREATE TRIGGER</command> will enter a new trigger into the current
   data base.  The trigger will be associated with the relation
   <replaceable class="parameter">table</replaceable> and will execute
   the specified function <replaceable class="parameter">func</replaceable>.
   -->
 
   <command>CREATE TRIGGER</command>は、新しいトリガを現在のデータベースに登録します。そのトリガはリレーション<replaceable class="parameter">table</replaceable>と関連付けられ、指定された関数<replaceable class="parameter">func</replaceable>を実行します。

  </para>

  <para>
   <!-- 
   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 "visible" to the trigger.
   -->

   トリガは、タプルへの操作が開始される前（制約条件のチェックとINSERT、UPDATE、DELETEが行われる前）、あるいは操作が開始された後（制約条件がチェックされINSERT、UPDATE、DELETEが完了した後）の前後いずれでも起動を指定することができます。イベントの前にトリガが起動すると、そのトリガは指定したタプルに対する操作を省略することも、（INSERTとUPDATEの操作時のみ）挿入されたタプルを変更することもできます。イベントの後にトリガが起動すると、最終の挿入、更新あるいは削除を含んだすべての変更がトリガに「可視」となります。

  </para>

  <para>
   <!-- Refer to the chapters on SPI and Triggers in the
   <citetitle>PostgreSQL Programmer's Guide</citetitle> for more
   information. -->

   より詳しくは、<citetitle>&programmer-guide;</citetitle>のSPIとトリガの章を参照してください。 


  </para>

  <refsect2 id="R2-SQL-CREATETRIGGER-3">
   <refsect2info>
    <date>1998-09-21</date>
   </refsect2info>
   <title>
    <!-- Notes -->注釈
   </title>
   <para>
    <!-- 
    <command>CREATE TRIGGER</command> is a <productname>Postgres</productname>
    language extension. -->

    <command>CREATE TRIGGER</command>は<productname>Postgres</productname>の言語拡張です。 

   </para>
   <para>
    <!-- Only the relation owner may create a trigger on this relation.
    -->
    リレーションの所有者のみがこのリレーション上にトリガを作ることができます。

   </para>
   <para>
    <!-- 
    As of the current release (v7.0), STATEMENT triggers are not implemented.
    -->

    PostgreSQL 7.0の時点では、STATEMENTトリガは実装されていません。 


   </para>
   <para>
    <!-- 
    Refer to <command>DROP TRIGGER</command> for information on how to 
    remove triggers. -->

    トリガを削除する方法については、<command>DROP TRIGGER</command>を参照してください。 


   </para>   
  </refsect2>
 </refsect1>

 <refsect1 id="R1-SQL-CREATETRIGGER-2">
  <title>
   <!-- Usage -->使用方法
  </title>
  <para>
   <!-- 
   Check if the specified distributor code exists in the distributors
   table before appending or updating a row in the table films: -->

   指定されたdistributorのコードがdistributorsテーブルに存在するかどうか、テーブルfilmsに行を追加または更新する前にチェックするには以下のようにします。
</para>

<programlisting>
CREATE TRIGGER if_dist_exists
    BEFORE INSERT OR UPDATE ON films FOR EACH ROW
    EXECUTE PROCEDURE check_primary_key ('did', 'distributors', 'did');
</programlisting>

  <para>
   <!-- 
   Before cancelling a distributor or updating its code, remove every
   reference to the table films: -->

   distributorを消去するかまたはそのコードを変更する前に、テーブルfilmsに対するすべての参照を削除するには以下のようにします。
</para>

<programlisting>
CREATE TRIGGER if_film_exists 
    BEFORE DELETE OR UPDATE ON distributors FOR EACH ROW
    EXECUTE PROCEDURE check_foreign_key (1, 'CASCADE', 'did', 'films', 'did');
</programlisting>
 </refsect1>

 <refsect1 id="R1-SQL-CREATETRIGGER-3">
  <title>
   <!-- Compatibility -->互換性
  </title>
  
  <refsect2 id="R2-SQL-CREATETRIGGER-4">
   <refsect2info>
    <date>1998-09-21</date>
   </refsect2info>
   <title>
    SQL92
   </title>

   <para>
    <!-- 
    There is no <command>CREATE TRIGGER</command> in <acronym>SQL92</acronym>.
    -->

    <acronym>SQL92</acronym>には<command>CREATE TRIGGER</command>はありません。
   </para>

   <para>
    <!-- The second example above may also be done by using a FOREIGN KEY
    constraint as in: -->

    使用方法で示した2つ目の例は、FOREIGN KEY制約条件を使用し、以下のようにしても可能です。
</para>

<programlisting>
CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    CONSTRAINT if_film_exists
    FOREIGN KEY(did) REFERENCES films
    ON UPDATE CASCADE ON DELETE CASCADE  
);
</programlisting>
  </refsect2>
 </refsect1>
</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:nil
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:
-->
