<!--
$Header: /usr/prj/pg/cvsroot/doc/doc/src/sgml/ref/create_rule.sgml,v 1.6 2001/09/14 08:21:19 t-ishii Exp $
Postgres documentation
-->

<refentry id="SQL-CREATERULE">
 <refmeta>
  <refentrytitle id="sql-createrule-title">
   CREATE RULE
  </refentrytitle>
  <refmiscinfo>SQL<!-- Language Statements -->言語</refmiscinfo>
 </refmeta>
 <refnamediv>
  <refname>
   CREATE RULE
  </refname>
  <refpurpose>
   <!-- Defines a new rule -->
   新しいルールを定義します。<indexterm><primary>CREATE RULE</primary></indexterm><indexterm><primary>SQL</primary><secondary>CREATE RULE</secondary></indexterm><indexterm><primary sortas="るーる">ルール</primary><secondary sortas="さくせい">作成</secondary></indexterm>
  </refpurpose>
 </refnamediv>
 <refsynopsisdiv>
  <refsynopsisdivinfo>
   <date>2001-01-05</date>
  </refsynopsisdivinfo>
<synopsis>
CREATE RULE <replaceable class="parameter">name</replaceable> AS ON <replaceable class="parameter">event</replaceable>
    TO <replaceable class="parameter">object</replaceable> [ WHERE <replaceable class="parameter">condition</replaceable> ]
    DO [ INSTEAD ] <replaceable class="parameter">action</replaceable>

where <replaceable class="PARAMETER">action</replaceable> can be:

NOTHING
|
<replaceable class="parameter">query</replaceable>
|
( <replaceable class="parameter">query</replaceable> ; <replaceable class="parameter">query</replaceable> ... )
|
[ <replaceable class="parameter">query</replaceable> ; <replaceable class="parameter">query</replaceable> ... ]
</synopsis>

  <refsect2 id="R2-SQL-CREATERULE-1">
   <refsect2info>
    <date>2001-01-05</date>
   </refsect2info>
   <title>
    <!-- Inputs -->入力
   </title>

    <variablelist>
     <varlistentry>
      <term><replaceable class="parameter">name</replaceable></term>
      <listitem>
       <para>
	<!-- The name of a rule to create. -->
        作成するルールの名前です。
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="parameter">event</replaceable></term>
      <listitem>
       <para>
        <!-- 
	Event is one of <literal>SELECT</literal>,
	<literal>UPDATE</literal>, <literal>DELETE</literal>
	or <literal>INSERT</literal>. -->

        イベントとは、<literal>SELECT</literal>、<literal>UPDATE</literal>、<literal>DELETE</literal><literal>INSERT</literal>のどれかです。

       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="parameter">object</replaceable></term>
      <listitem>
       <para>
        <!-- 
	Object is either <replaceable class="parameter">table</replaceable>
	or <replaceable class="parameter">table</replaceable>.<replaceable
	 class="parameter">column</replaceable>.  (Currently, only the
	 <replaceable class="parameter">table</replaceable> form is
	 actually implemented.) -->

         オブジェクトとは、<replaceable class="parameter">table</replaceable>または<replaceable class="parameter">table</replaceable>.<replaceable class="parameter">column</replaceable>のいずれかです（現時点では<replaceable class="parameter">table</replaceable>のみが実際に実装されています）。

       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="parameter">condition</replaceable></term>
      <listitem>
       <para>
        <!-- 
	Any SQL boolean-condition expression.  The condition expression may not
	refer to any tables except <literal>new</literal> and
	<literal>old</literal>. -->

        任意のブール（論理）条件式です。条件式は<literal>new</literal>と<literal>old</literal>以外のどのテーブルを参照することも
        できません。

       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="parameter">query</replaceable></term>
      <listitem>
       <para>
        <!-- The query or queries making up the
	<replaceable class="PARAMETER">action</replaceable>
	can be any SQL <literal>SELECT</literal>, <literal>INSERT</literal>,
	<literal>UPDATE</literal>, <literal>DELETE</literal>, or
	<literal>NOTIFY</literal> statement. -->

        <replaceable class="PARAMETER">action</replaceable>を構成する単数または複数の問い合わせは、任意のSQL <literal>SELECT</literal>、<literal>INSERT</literal>、<literal>UPDATE</literal>、<literal>DELETE</literal>、<literal>NOTIFY</literal>文のどれでも構いません。

       </para>
      </listitem>
     </varlistentry>
    </variablelist>

   <para>
    <!-- 
    Within the <replaceable class="parameter">condition</replaceable>
    and <replaceable class="PARAMETER">action</replaceable>, the special
    table names <literal>new</literal> and <literal>old</literal> may be
    used to refer to values in the referenced table (the
    <replaceable class="parameter">object</replaceable>).
    <literal>new</literal> is valid in ON INSERT and ON UPDATE rules
    to refer to the new row being inserted or updated.
    <literal>old</literal> is valid in ON SELECT, ON UPDATE, and ON DELETE
    rules to refer to the existing row being selected, updated, or deleted.
    -->

    <replaceable class="parameter">condition</replaceable>と<replaceable class="PARAMETER">action</replaceable>の内部では、特別なテーブル名<literal>new</literal>と<literal>old</literal>は参照されるテーブル（<replaceable class="parameter">object</replaceable>）の値を参照するために使うことができます。<literal>new</literal>はON INSERTとON UPDATEルール内で挿入または更新されている新しい行の参照に有効です。<literal>old</literal>はON SELECT、ON UPDATE、ON DELETEルールが選択、更新、削除されている既存の行を参照するのに有効です。

   </para>
  </refsect2>

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

    <variablelist>
     <varlistentry>
      <term><computeroutput>
CREATE
       </computeroutput></term>
      <listitem>
       <para>
	<!-- Message returned if the rule is successfully created. -->
        ルールの作成に成功すると返されるメッセージです。
       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </refsect2>
 </refsynopsisdiv>

 <refsect1 id="R1-SQL-CREATERULE-1">
  <refsect1info>
   <date>1998-09-11</date>
  </refsect1info>
  <title>
   <!-- Description -->説明
  </title>

  <para>
   <!-- The <productname>Postgres</productname> 
   <firstterm>rule system</firstterm> allows one to define an
   alternate action to be performed on inserts, updates, or deletions
   from database tables. Rules are used to
   implement table views as well. -->

   <productname>Postgres</productname>の<firstterm>ルールシステム</firstterm>は、データベーステーブルの挿入、更新、削除の代替として行われるアクションを定義することを許可します。ルールはテーブルビューを実装するためにも使われます。

  </para>

  <para>
   <!-- 
   The semantics of a rule is that at the time an individual instance (row)
   is
   accessed, inserted, updated, or deleted, there is an old instance (for
   selects, updates and deletes) and a new instance (for inserts and
   updates).  All the rules for the given event type and the given target
   object (table) are examined, in an unspecified order.  If the
   <replaceable class="parameter">condition</replaceable> specified in the
   WHERE clause (if any) is true, the 
   <replaceable class="parameter">action</replaceable> part of the rule is
   executed.  The <replaceable class="parameter">action</replaceable> is
   done instead of the original query if INSTEAD is specified; otherwise
   it is done before the original query is performed.
   Within both the <replaceable class="parameter">condition</replaceable>
   and <replaceable class="parameter">action</replaceable>, values from
   fields in the old instance and/or the new instance are substituted for
   <literal>old.</literal><replaceable class="parameter">attribute-name
   </replaceable>
   and <literal>new.</literal><replaceable class="parameter">attribute-name
   </replaceable>. -->

   ルールの語義は個別のインスタンス（行）がアクセスされ、挿入、更新、削除される場合、古いインスタンス（選択、更新、削除の対象）と、新しいインスタンスが（更新と追加の対象）存在するということです。与えられたイベント型と目的のオブジェクト（テーブル）のすべてのルールは、特定されない順番で審査されます。WHERE句（存在する場合）で指定された<replaceable class="parameter">condition</replaceable>が真である場合、そのルールの<replaceable class="parameter">action</replaceable>部分が実行されます。INSTEADが指定されると、元の問い合わせの代わりに<replaceable class="parameter">action</replaceable>が行われます。そうでない場合は元の問い合わせが実行される前に行われます。<replaceable class="parameter">condition</replaceable>と<replaceable class="parameter">action</replaceable>の両方のなkで、古いインスタンスあるいは新しいインスタンスの中のフィールドの値は<literal>old.</literal><replaceable class="parameter">attribute-name</replaceable>と<literal>new.</literal><replaceable class="parameter">attribute-name</replaceable>で置き換えられます。

  </para>

  <para>
   <!-- 
   The <replaceable class="parameter">action</replaceable> part of the rule
   can consist of one or more queries.  To write multiple queries, surround
   them with either parentheses or square brackets.  Such queries will be
   performed in the specified order (whereas there are no guarantees about
   the execution order of multiple rules for an object).  The
   <replaceable class="parameter">action</replaceable> can also be NOTHING
   indicating no action.  Thus, a DO INSTEAD NOTHING rule suppresses the
   original query from executing (when its condition is true); a DO NOTHING
   rule is useless. -->

   ルールの<replaceable class="parameter">action</replaceable>部分は、1つ以上の問い合わせを持つことができます。複数の問い合わせを書くためには、かっこまたは大かっこ（[]）で囲みます。そのような問い合わせは指定された順番で実行されます（一方、オブジェクトの複数ルールの実行順番には何も保障がありません）。<replaceable class="parameter">action</replaceable>は動作が何もないことを示すためにNOTHINGを使うこともできます。したがって、DO INSTEAD NOTHINGルールは元の問い合わせを実行しないように抑制します。DO NOTHINGルールはなにもしません。

  </para>

  <para>
   <!-- 
   The <replaceable class="parameter">action</replaceable> part of the rule
   executes with the same command and transaction identifier as the user
   command that caused activation. -->

   ルールの<replaceable class="parameter">action</replaceable>部分は動作を促したユーザーコマンドと同じコマンドとトランザクション識別子を実行します。

  </para>
  
  <refsect2 id="R2-SQL-CREATERULE-3">
   <refsect2info>
    <date>2001-01-05</date>
   </refsect2info>
   <title>
    <!-- Notes -->注釈
   </title>
   <para>
    <!-- 
    Presently, ON SELECT rules must be unconditional INSTEAD rules and must
    have actions that consist of a single SELECT query.  Thus, an ON SELECT
    rule effectively turns the object table into a view, whose visible
    contents are the rows returned by the rule's SELECT query rather than
    whatever had been stored in the table (if anything).  It is considered
    better style to write a CREATE VIEW command than to create a table and
    define an ON SELECT rule for it. -->

    現時点では、ON SELECTルールは無条件のINSTEADルールでなければならず、単一SELECT問い合わせで成り立つアクションを持っていなければなりません。このようにして、ON SELECTルールはオブジェクトテーブルを効果的にビューに変え、そのビューの可視的な内容は（もしあったとしても）テーブル内に格納されているものではなく、ルールのSELECT問い合わせによって返された行です。テーブルを作成しそれにON SELECTルールを定義するよりはCREATE VIEWコマンドを書く方がよい形式とされています。 

   </para>

   <para>
    <!-- 
    You must have rule definition access to a table in order
    to define a rule on it. Use <command>GRANT</command>
    and <command>REVOKE</command> to change permissions. -->

    テーブルにルールを定義するためには、ルール定義アクセス権を持っていなければなりません。権限を変えるには<command>GRANT</command>と<command>REVOKE</command>を使います。
   </para>

   <para>
    <!-- 
    It is very important to take care to avoid circular rules.
    For example, though each
    of the following two rule definitions are accepted by
    <productname>Postgres</productname>, the
    select command will cause <productname>Postgres</productname> to 
    report an error because the query cycled too many times:
    -->

    循環ルールを避けるために注意を払うことはとても重要です。たとえば、下記の2つのルールそれぞれが<productname>Postgres</productname>に受け入れられた場合、SELECTコマンドは、問い合わせが何度も循環しすぎたために<productname>Postgres</productname>にエラーを表示させます。<indexterm><primary sortas="じゅんかんるーる">循環ルール</primary></indexterm><indexterm><primary sortas="るーる">ルール</primary><secondary sortas="じゅんかんるーる">循環ルール</secondary></indexterm>
</para>

    <example>
     <title><!-- Example of a circular rewrite rule combination: -->
            循環リライトルールコンビネーションの例</title>
<programlisting>
CREATE RULE "_RETemp" AS
    ON SELECT TO emp
    DO INSTEAD 
	SELECT * FROM toyemp;
</programlisting>

<programlisting>
CREATE RULE "_RETtoyemp" AS
    ON SELECT TO toyemp
    DO INSTEAD 
	SELECT * FROM emp;
</programlisting>

     <para>
      <!-- This attempt to select from EMP will cause
      <productname>Postgres</productname> to issue an error
      because the queries cycled too many times: -->

      このEMPから選択しようという試みは、問い合わせが何度も循環しすぎるために<productname>Postgres</productname>にエラーを発行させます。
</para>

<programlisting>
SELECT * FROM emp;
</programlisting>
    </example>
  </refsect2>
 </refsect1>

 <refsect1 id="R1-SQL-CREATERULE-4">
  <title>
   <!-- Compatibility -->互換性
  </title>

  <refsect2 id="R2-SQL-CREATERULE-4">
   <refsect2info>
    <date>1998-09-11</date>
   </refsect2info>
   <title>
    SQL92
   </title>

   <para>
    <!-- 
    <command>CREATE RULE</command> statement is a 
    <productname>Postgres</productname>
    language extension.
    There is no <command>CREATE RULE</command> statement in 
    <acronym>SQL92</acronym>. -->

     <command>CREATE RULE</command>文は<productname>Postgres</productname>言語拡張です。<acronym>SQL92</acronym>には<command>CREATE RULE</command>はありません。

   </para>
  </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:
-->
