summaryrefslogtreecommitdiff
path: root/doc/src/sgml/ref/create_rule.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/sgml/ref/create_rule.sgml')
-rw-r--r--doc/src/sgml/ref/create_rule.sgml344
1 files changed, 0 insertions, 344 deletions
diff --git a/doc/src/sgml/ref/create_rule.sgml b/doc/src/sgml/ref/create_rule.sgml
deleted file mode 100644
index 86046359b4a..00000000000
--- a/doc/src/sgml/ref/create_rule.sgml
+++ /dev/null
@@ -1,344 +0,0 @@
-<!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_rule.sgml,v 1.36 2002/05/18 15:44:47 petere Exp $
-PostgreSQL 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>
- define a new rewrite rule
- </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">table</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> ... )
- </synopsis>
-
- <refsect2 id="R2-SQL-CREATERULE-1">
- <refsect2info>
- <date>2001-01-05</date>
- </refsect2info>
- <title>
- Inputs
- </title>
- <para>
-
- <variablelist>
- <varlistentry>
- <term><replaceable class="parameter">name</replaceable></term>
- <listitem>
- <para>
- The name of a rule to create. This must be distinct from the name
- of any other rule for the same table.
- </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>.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><replaceable class="parameter">table</replaceable></term>
- <listitem>
- <para>
- The name (optionally schema-qualified) of the table or view the rule
- applies to.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><replaceable class="parameter">condition</replaceable></term>
- <listitem>
- <para>
- Any SQL conditional expression (returning <type>boolean</type>). The condition expression may not
- refer to any tables except <literal>new</literal> and
- <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.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
-
- <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.
- <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 UPDATE and ON DELETE
- rules to refer to the existing row being updated or deleted.
- </para>
- </refsect2>
-
- <refsect2 id="R2-SQL-CREATERULE-2">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
- <title>
- Outputs
- </title>
- <para>
-
- <variablelist>
- <varlistentry>
- <term><computeroutput>
-CREATE RULE
- </computeroutput></term>
- <listitem>
- <para>
- Message returned if the rule is successfully created.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- </para>
- </refsect2>
- </refsynopsisdiv>
-
- <refsect1 id="R1-SQL-CREATERULE-1">
- <refsect1info>
- <date>1998-09-11</date>
- </refsect1info>
- <title>
- Description
- </title>
-
- <para>
- The <productname>PostgreSQL</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.
- </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
- table are examined successively (in order by name). 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 after the original query in the case of ON INSERT, or before
- the original query in the case of ON UPDATE or ON DELETE.
- 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>.
- </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 parentheses. Such queries will be performed in the
- specified order. 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.
- </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.
- </para>
-
- <para>
- It is important to realize that a rule is really a query transformation
- mechanism, or query macro. The entire query is processed to convert it
- into a series of queries that include the rule actions. This occurs
- before evaluation of the query starts. So, conditional rules are
- handled by adding the rule condition to the WHERE clause of the action(s)
- derived from the rule. The above description of a rule as an operation
- that executes for each row is thus somewhat misleading. If you actually
- want an operation that fires independently for each physical row, you
- probably want to use a trigger not a rule. Rules are most useful for
- situations that call for transforming entire queries independently of
- the specific data being handled.
- </para>
-
- <refsect2 id="R2-SQL-CREATERULE-3">
- <refsect2info>
- <date>2001-11-06</date>
- </refsect2info>
- <title>
- Rules and Views
- </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 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 real table
- and define an ON SELECT rule for it.
- </para>
-
- <para>
- <xref linkend="sql-createview"> creates a dummy table (with no underlying
- storage) and associates an ON SELECT rule with it. The system will not
- allow updates to the view, since it knows there is no real table there.
- You can create the
- illusion of an updatable view by defining ON INSERT, ON UPDATE, and
- ON DELETE rules (or any subset of those that's sufficient
- for your purposes) to replace update actions on the view with
- appropriate updates on other tables.
- </para>
-
- <para>
- There is a catch if you try to use conditional
- rules for view updates: there <emphasis>must</> be an unconditional
- INSTEAD rule for each action you wish to allow on the view. If the
- rule is conditional, or is not INSTEAD, then the system will still reject
- attempts to perform the update action, because it thinks it might end up
- trying to perform the action on the dummy table in some cases.
- If you want to
- handle all the useful cases in conditional rules, you can; just add an
- unconditional DO INSTEAD NOTHING rule to ensure that the system
- understands it will never be called on to update the dummy table. Then
- make the conditional rules non-INSTEAD; in the cases where they fire,
- they add to the default INSTEAD NOTHING action.
- </para>
- </refsect2>
-
- <refsect2 id="R2-SQL-CREATERULE-4">
- <refsect2info>
- <date>2001-01-05</date>
- </refsect2info>
- <title>
- Notes
- </title>
- <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.
- </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>PostgreSQL</productname>, the
- select command will cause <productname>PostgreSQL</productname> to
- report an error because the query cycled too many times:
-
-<programlisting>
-CREATE RULE "_RETURN" AS
- ON SELECT TO emp
- DO INSTEAD
- SELECT * FROM toyemp;
-
-CREATE RULE "_RETURN" AS
- ON SELECT TO toyemp
- DO INSTEAD
- SELECT * FROM emp;
-</programlisting>
-
- This attempt to select from <literal>EMP</literal> will cause
- <productname>PostgreSQL</productname> to issue an error
- because the queries cycled too many times:
-
- <programlisting>
-SELECT * FROM emp;
-</programlisting>
- </para>
-
- <para>
- Presently, if a rule contains a NOTIFY query, the NOTIFY will be executed
- unconditionally --- that is, the NOTIFY will be issued even if there are
- not any rows that the rule should apply to. For example, in
- <programlisting>
-CREATE RULE notify_me AS ON UPDATE TO mytable DO NOTIFY mytable;
-
-UPDATE mytable SET name = 'foo' WHERE id = 42;
- </programlisting>
- one NOTIFY event will be sent during the UPDATE, whether or not there
- are any rows with id = 42. This is an implementation restriction that
- may be fixed in future releases.
- </para>
- </refsect2>
- </refsect1>
-
- <refsect1 id="R1-SQL-CREATERULE-4">
- <title>
- Compatibility
- </title>
-
- <refsect2 id="R2-SQL-CREATERULE-5">
- <refsect2info>
- <date>1998-09-11</date>
- </refsect2info>
- <title>
- SQL92
- </title>
-
- <para>
- <command>CREATE RULE</command> statement is a <productname>PostgreSQL</productname>
- language extension.
- There is no <command>CREATE RULE</command> statement in <acronym>SQL92</acronym>.
- </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:
--->