create_rule.sgml
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:10k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. <refentry id="SQL-CREATERULE">
  2.  <refmeta>
  3.   <refentrytitle>
  4.    CREATE RULE
  5.   </refentrytitle>
  6.   <refmiscinfo>SQL - Language Statements</refmiscinfo>
  7.  </refmeta>
  8.  <refnamediv>
  9.   <refname>
  10.    CREATE RULE
  11.   </refname>
  12.   <refpurpose>
  13.    Defines a new rule
  14.   </refpurpose>
  15.  </refnamediv>
  16.  <refsynopsisdiv>
  17.   <refsynopsisdivinfo>
  18.    <date>1998-09-11</date>
  19.   </refsynopsisdivinfo>
  20.   <synopsis>
  21. CREATE RULE <replaceable class="parameter">name</replaceable> AS ON <replaceable class="parameter">event</replaceable>
  22.     TO <replaceable class="parameter">object</replaceable> [ WHERE <replaceable class="parameter">condition</replaceable> ]
  23.     DO [ INSTEAD ] [ <replaceable class="parameter">action</replaceable> | NOTHING ]
  24.   </synopsis>
  25.   <refsect2 id="R2-SQL-CREATERULE-1">
  26.    <refsect2info>
  27.     <date>1998-09-11</date>
  28.    </refsect2info>
  29.    <title>
  30.     Inputs
  31.    </title>
  32.    <para>
  33.     <variablelist>
  34.      <varlistentry>
  35.       <term><replaceable class="parameter">name</replaceable></term>
  36.       <listitem>
  37.        <para>
  38. The name of a rule to create.
  39.        </para>
  40.       </listitem>
  41.      </varlistentry>
  42.      <varlistentry>
  43.       <term><replaceable class="parameter">event</replaceable></term>
  44.       <listitem>
  45.        <para>
  46. Event is one of <literal>select</literal>,
  47. <literal>update</literal>, <literal>delete</literal>
  48. or <literal>insert</literal>.
  49.        </para>
  50.       </listitem>
  51.      </varlistentry>
  52.      <varlistentry>
  53.       <term><replaceable class="parameter">object</replaceable></term>
  54.       <listitem>
  55.        <para>
  56. Object is either <replaceable class="parameter">table</replaceable>
  57. or <replaceable class="parameter">table</replaceable>.<replaceable
  58.  class="parameter">column</replaceable>.
  59.        </para>
  60.       </listitem>
  61.      </varlistentry>
  62.      <varlistentry>
  63.       <term><replaceable class="parameter">condition</replaceable></term>
  64.       <listitem>
  65.        <para>
  66. Any SQL WHERE clause. <literal>new</literal> or
  67. <literal>current</literal> can appear instead of an instance
  68. variable whenever an instance variable is permissible in SQL.
  69.        </para>
  70.       </listitem>
  71.      </varlistentry>
  72.      <varlistentry>
  73.       <term><replaceable class="parameter">action</replaceable></term>
  74.       <listitem>
  75.        <para>
  76. Any SQL statement. <literal>new</literal> or
  77. <literal>current</literal> can appear instead of an instance
  78. variable whenever an instance variable is permissible in SQL.
  79.        </para>
  80.       </listitem>
  81.      </varlistentry>
  82.     </variablelist>
  83.    </para>
  84.   </refsect2>
  85.   <refsect2 id="R2-SQL-CREATERULE-2">
  86.    <refsect2info>
  87.     <date>1998-09-11</date>
  88.    </refsect2info>
  89.    <title>
  90.     Outputs
  91.    </title>
  92.    <para>
  93.     <variablelist>
  94.      <varlistentry>
  95.       <term><computeroutput>
  96. CREATE
  97.        </computeroutput></term>
  98.       <listitem>
  99.        <para>
  100. Message returned if the rule is successfully created.
  101.        </para>
  102.       </listitem>
  103.      </varlistentry>
  104.     </variablelist>
  105.    </para>
  106.   </refsect2>
  107.  </refsynopsisdiv>
  108.  <refsect1 id="R1-SQL-CREATERULE-1">
  109.   <refsect1info>
  110.    <date>1998-09-11</date>
  111.   </refsect1info>
  112.   <title>
  113.    Description
  114.   </title>
  115.   <para>
  116.    The semantics of a rule is that at the time an individual instance is
  117.    accessed, updated, inserted or deleted, there is a current instance (for
  118.    retrieves, updates and deletes) and a new instance (for updates and
  119.    appends).  If the <replaceable class="parameter">event</replaceable>
  120.    specified in the ON clause and the
  121.    <replaceable class="parameter">condition</replaceable> specified in the
  122.    WHERE clause are true for the current instance, the
  123.    <replaceable class="parameter">action</replaceable> part of the rule is
  124.    executed. First, however, values from fields in the current instance
  125.    and/or the new instance are substituted for
  126.    <literal>current.</literal><replaceable class="parameter">attribute-name</replaceable>
  127.    and <literal>new.</literal><replaceable class="parameter">attribute-name</replaceable>.
  128.   </para>
  129.   <para>
  130.    The <replaceable class="parameter">action</replaceable> part of the rule
  131.    executes with the same command and transaction identifier as the user
  132.    command that caused activation.
  133.   </para>
  134.   
  135.   <refsect2 id="R2-SQL-CREATERULE-3">
  136.    <refsect2info>
  137.     <date>1998-09-11</date>
  138.    </refsect2info>
  139.    <title>
  140.     Notes
  141.    </title>
  142.    <para>
  143.     A caution about SQL rules is in  order.  If the same class name
  144.     or instance variable appears in the
  145.     <replaceable class="parameter">event</replaceable>, the
  146.     <replaceable class="parameter">condition</replaceable> and the
  147.     <replaceable class="parameter">action</replaceable> parts of a rule,
  148.     they are all considered different tuple variables. More accurately,
  149.     <literal>new</literal> and <literal>current</literal> are the only tuple
  150.     variables that are shared between these clauses. For example, the following
  151.     two rules have the same semantics:
  152.     <programlisting>
  153. ON UPDATE TO emp.salary WHERE emp.name = "Joe"
  154.     DO UPDATE emp ( ... ) WHERE ...
  155.     </programlisting>
  156.     <programlisting>
  157. ON UPDATE TO emp-1.salary WHERE emp-2.name = "Joe"
  158.     DO UPDATE emp-3 ( ... ) WHERE ...
  159.     </programlisting>
  160.     Each rule can have the optional tag INSTEAD.
  161.     Without
  162.     this tag, <replaceable class="parameter">action</replaceable> will be
  163.     performed in addition to the user command when the
  164.     <replaceable class="parameter">event</replaceable> in the
  165.     <replaceable class="parameter">condition</replaceable> part of the rule
  166.     occurs. Alternately, the
  167.     <replaceable class="parameter">action</replaceable> part will be done
  168.     instead of the user command. In this later case, the
  169.     <replaceable class="parameter">action</replaceable> can be the keyword
  170.     <literal>NOTHING</literal>.
  171.    </para>
  172.    <para>
  173.     When choosing between the rewrite and instance rule systems for a
  174.     particular rule application, remember that in the rewrite system,
  175.     <literal>current</literal> refers to a relation and some qualifiers
  176.     whereas in the instance system it refers to an instance (tuple).
  177.    </para>
  178.    <para>
  179.     It is very important to note that the rewrite rule system
  180.     will neither detect nor process circular rules. For example, though each
  181.     of the following two rule definitions are accepted by
  182.     <productname>Postgres</productname>, the
  183.     retrieve command will cause <productname>Postgres</productname> to crash:
  184.     <example>
  185.      <title>Example of a circular rewrite rule combination.</title>
  186.      <programlisting>
  187. CREATE RULE bad_rule_combination_1 AS
  188.     ON SELECT TO emp
  189.     DO INSTEAD SELECT TO toyemp;
  190.      </programlisting>
  191.      <programlisting>
  192. CREATE RULE bad_rule_combination_2 AS
  193.     ON SELECT TO toyemp
  194.     DO INSTEAD SELECT TO emp;
  195.      </programlisting>
  196.      <para>
  197.       This attempt to retrieve from EMP will cause
  198.       <productname>Postgres</productname> to crash.
  199.       <programlisting>
  200. SELECT * FROM emp;
  201.       </programlisting></para>
  202.     </example>
  203.    </para>
  204.    <para>
  205.     You must have rule definition access to a class in order
  206.     to define a rule on it. Use <command>GRANT</command>
  207.     and <command>REVOKE</command> to change permissions.
  208.    </para>
  209.   </refsect2>
  210.  </refsect1>
  211.  
  212.  <refsect1 id="R1-SQL-CREATERULE-2">
  213.   <title>
  214.    Usage
  215.   </title>
  216.   <para>
  217.    Make Sam get the same salary adjustment as Joe:
  218.    
  219.    <programlisting>
  220. CREATE RULE example_1 AS
  221.     ON UPDATE emp.salary WHERE current.name = "Joe"
  222.     DO UPDATE emp (salary = new.salary)
  223.     WHERE emp.name = "Sam";
  224.    </programlisting>
  225.    At the time Joe receives a salary adjustment, the event
  226.    will become true and Joe's current instance and proposed
  227.    new instance are available to the execution routines.
  228.    Hence, his new salary is substituted into the action part
  229.    of the rule which is subsequently executed.  This propagates
  230.    Joe's salary on to Sam.
  231.   </para>
  232.   <para>
  233.    Make Bill get Joe's salary when it is accessed:
  234.    <programlisting>
  235. CREATE RULE example_2 AS
  236.     ON SELECT TO EMP.salary
  237.     WHERE current.name = "Bill"
  238.     DO INSTEAD
  239.     SELECT (emp.salary) from emp
  240.         WHERE emp.name = "Joe";
  241.    </programlisting>
  242.   </para>
  243.   <para>
  244.    Deny Joe access to the salary of employees in the shoe
  245.    department (<function>current_user</function> returns the name of
  246.    the current user):
  247.    <programlisting>  
  248. CREATE RULE example_3 AS
  249.     ON SELECT TO emp.salary
  250.     WHERE current.dept = "shoe" AND current_user = "Joe"
  251.     DO INSTEAD NOTHING;
  252.    </programlisting>
  253.   </para>
  254.   <para>
  255.    Create a view of the employees working in the toy department.
  256.    <programlisting>
  257. CREATE toyemp(name = char16, salary = int4);
  258. CREATE RULE example_4 AS
  259.     ON SELECT TO toyemp
  260.     DO INSTEAD
  261.     SELECT (emp.name, emp.salary) FROM emp
  262.         WHERE emp.dept = "toy";
  263.    </programlisting>
  264.   </para>
  265.   <para>
  266.    All new employees must make 5,000 or less
  267.    <programlisting>
  268. CREATE RULE example_5 AS
  269.     ON INERT TO emp WHERE new.salary > 5000
  270.     DO UPDATE NEWSET salary = 5000;
  271.    </programlisting>
  272.   </para>
  273.  </refsect1>
  274.  <refsect1 id="R1-SQL-CREATERULE-3">
  275.   <title>
  276.    Bugs
  277.   </title>
  278.   <para>
  279.    The object in a <acronym>SQL</acronym> rule cannot be an array reference and
  280.    cannot have parameters.
  281.   </para>
  282.   <para>
  283.    Aside from the "oid" field, system attributes cannot be
  284.    referenced anywhere in a rule. Among other things, this
  285.    means that functions of instances (e.g., "<literal>foo(emp)</literal>" where
  286.    "<literal>emp</literal>" is a class) cannot be called anywhere in a rule.
  287.   </para>
  288.   <para>
  289.    The rule system stores the rule text and query plans as
  290.    text attributes. This implies that creation of rules may
  291.    fail if the rule plus its various internal representations
  292.    exceed some value that is on the order of one page (8KB).
  293.    </para>
  294.  </refsect1>
  295.  <refsect1 id="R1-SQL-CREATERULE-4">
  296.   <title>
  297.    Compatibility
  298.   </title>
  299.   <para>
  300.    <command>CREATE RULE</command> statement is a <productname>Postgres</productname>
  301.    language extension.
  302.   </para>
  303.   <refsect2 id="R2-SQL-CREATERULE-4">
  304.    <refsect2info>
  305.     <date>1998-09-11</date>
  306.    </refsect2info>
  307.    <title>
  308.     SQL92
  309.    </title>
  310.    <para>
  311.     There is no <command>CREATE RULE</command> statement in <acronym>SQL92</acronym>.
  312.    </para>
  313.   </refsect2>
  314.  </refsect1>
  315. </refentry>
  316. <!-- Keep this comment at the end of the file
  317. Local variables:
  318. mode: sgml
  319. sgml-omittag:nil
  320. sgml-shorttag:t
  321. sgml-minimize-attributes:nil
  322. sgml-always-quote-attributes:t
  323. sgml-indent-step:1
  324. sgml-indent-data:t
  325. sgml-parent-document:nil
  326. sgml-default-dtd-file:"../reference.ced"
  327. sgml-exposed-tags:nil
  328. sgml-local-catalogs:"/usr/lib/sgml/catalog"
  329. sgml-local-ecat-files:nil
  330. End:
  331. -->