1999-07-22 17:09:15 +02:00
|
|
|
<!--
|
2001-01-06 05:14:35 +01:00
|
|
|
$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_rule.sgml,v 1.21 2001/01/06 04:14:35 tgl Exp $
|
1999-07-22 17:09:15 +02:00
|
|
|
Postgres documentation
|
|
|
|
-->
|
|
|
|
|
1999-07-06 19:16:42 +02:00
|
|
|
<refentry id="SQL-CREATERULE">
|
|
|
|
<refmeta>
|
1999-07-22 17:09:15 +02:00
|
|
|
<refentrytitle id="sql-createrule-title">
|
1998-07-14 05:47:34 +02:00
|
|
|
CREATE RULE
|
1999-07-06 19:16:42 +02:00
|
|
|
</refentrytitle>
|
|
|
|
<refmiscinfo>SQL - Language Statements</refmiscinfo>
|
|
|
|
</refmeta>
|
|
|
|
<refnamediv>
|
|
|
|
<refname>
|
1998-07-14 05:47:34 +02:00
|
|
|
CREATE RULE
|
1999-07-06 19:16:42 +02:00
|
|
|
</refname>
|
|
|
|
<refpurpose>
|
1998-08-15 09:00:37 +02:00
|
|
|
Defines a new rule
|
1999-07-06 19:16:42 +02:00
|
|
|
</refpurpose>
|
1998-12-29 03:24:47 +01:00
|
|
|
</refnamediv>
|
1999-07-06 19:16:42 +02:00
|
|
|
<refsynopsisdiv>
|
|
|
|
<refsynopsisdivinfo>
|
2001-01-06 05:14:35 +01:00
|
|
|
<date>2001-01-05</date>
|
1999-07-06 19:16:42 +02:00
|
|
|
</refsynopsisdivinfo>
|
|
|
|
<synopsis>
|
|
|
|
CREATE RULE <replaceable class="parameter">name</replaceable> AS ON <replaceable class="parameter">event</replaceable>
|
1998-09-16 16:43:12 +02:00
|
|
|
TO <replaceable class="parameter">object</replaceable> [ WHERE <replaceable class="parameter">condition</replaceable> ]
|
2001-01-06 05:14:35 +01:00
|
|
|
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> ... ]
|
1999-07-06 19:16:42 +02:00
|
|
|
</synopsis>
|
|
|
|
|
|
|
|
<refsect2 id="R2-SQL-CREATERULE-1">
|
|
|
|
<refsect2info>
|
2001-01-06 05:14:35 +01:00
|
|
|
<date>2001-01-05</date>
|
1999-07-06 19:16:42 +02:00
|
|
|
</refsect2info>
|
|
|
|
<title>
|
1998-07-14 05:47:34 +02:00
|
|
|
Inputs
|
1999-07-06 19:16:42 +02:00
|
|
|
</title>
|
|
|
|
<para>
|
1998-09-16 16:43:12 +02:00
|
|
|
|
1999-07-06 19:16:42 +02:00
|
|
|
<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>
|
2001-01-06 05:14:35 +01:00
|
|
|
Event is one of <literal>SELECT</literal>,
|
|
|
|
<literal>UPDATE</literal>, <literal>DELETE</literal>
|
|
|
|
or <literal>INSERT</literal>.
|
1999-07-06 19:16:42 +02:00
|
|
|
</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
|
2001-01-06 05:14:35 +01:00
|
|
|
class="parameter">column</replaceable>. (Currently, only the
|
|
|
|
<replaceable class="parameter">table</replaceable> form is
|
|
|
|
actually implemented.)
|
1999-07-06 19:16:42 +02:00
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
|
|
<term><replaceable class="parameter">condition</replaceable></term>
|
|
|
|
<listitem>
|
|
|
|
<para>
|
2001-01-06 05:14:35 +01:00
|
|
|
Any SQL boolean-condition expression. The condition expression may not
|
|
|
|
refer to any tables except <literal>new</literal> and
|
|
|
|
<literal>old</literal>.
|
1999-07-06 19:16:42 +02:00
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
2001-01-06 05:14:35 +01:00
|
|
|
<term><replaceable class="parameter">query</replaceable></term>
|
1999-07-06 19:16:42 +02:00
|
|
|
<listitem>
|
|
|
|
<para>
|
2001-01-06 05:14:35 +01:00
|
|
|
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.
|
1999-07-06 19:16:42 +02:00
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
</varlistentry>
|
|
|
|
</variablelist>
|
|
|
|
</para>
|
2001-01-06 05:14:35 +01:00
|
|
|
|
|
|
|
<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.
|
|
|
|
</para>
|
1999-07-06 19:16:42 +02:00
|
|
|
</refsect2>
|
|
|
|
|
|
|
|
<refsect2 id="R2-SQL-CREATERULE-2">
|
|
|
|
<refsect2info>
|
|
|
|
<date>1998-09-11</date>
|
|
|
|
</refsect2info>
|
|
|
|
<title>
|
1998-07-14 05:47:34 +02:00
|
|
|
Outputs
|
1999-07-06 19:16:42 +02:00
|
|
|
</title>
|
|
|
|
<para>
|
|
|
|
|
|
|
|
<variablelist>
|
|
|
|
<varlistentry>
|
|
|
|
<term><computeroutput>
|
|
|
|
CREATE
|
|
|
|
</computeroutput></term>
|
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
Message returned if the rule is successfully created.
|
|
|
|
</para>
|
1998-12-29 03:24:47 +01:00
|
|
|
</listitem>
|
1999-07-06 19:16:42 +02:00
|
|
|
</varlistentry>
|
|
|
|
</variablelist>
|
1998-12-29 03:24:47 +01:00
|
|
|
</para>
|
1999-07-06 19:16:42 +02:00
|
|
|
</refsect2>
|
|
|
|
</refsynopsisdiv>
|
|
|
|
|
|
|
|
<refsect1 id="R1-SQL-CREATERULE-1">
|
|
|
|
<refsect1info>
|
|
|
|
<date>1998-09-11</date>
|
|
|
|
</refsect1info>
|
|
|
|
<title>
|
1998-07-14 05:47:34 +02:00
|
|
|
Description
|
1999-07-06 19:16:42 +02:00
|
|
|
</title>
|
1999-07-22 17:09:15 +02:00
|
|
|
|
|
|
|
<para>
|
|
|
|
The <productname>Postgres</productname>
|
|
|
|
<firstterm>rule system</firstterm> allows one to define an
|
2000-04-07 21:17:51 +02:00
|
|
|
alternate action to be performed on inserts, updates, or deletions
|
2001-01-06 05:14:35 +01:00
|
|
|
from database tables. Rules are used to
|
|
|
|
implement table views as well.
|
1999-07-22 17:09:15 +02:00
|
|
|
</para>
|
|
|
|
|
1999-07-06 19:16:42 +02:00
|
|
|
<para>
|
2001-01-06 05:14:35 +01:00
|
|
|
The semantics of a rule is that at the time an individual instance (row)
|
|
|
|
is
|
2000-10-05 21:48:34 +02:00
|
|
|
accessed, inserted, updated, or deleted, there is an old instance (for
|
2000-04-07 21:17:51 +02:00
|
|
|
selects, updates and deletes) and a new instance (for inserts and
|
2001-01-06 05:14:35 +01:00
|
|
|
updates). All the rules for the given event type and the given target
|
|
|
|
object (table) are examined, in an unspecified order. If the
|
1998-07-14 05:47:34 +02:00
|
|
|
<replaceable class="parameter">condition</replaceable> specified in the
|
2001-01-06 05:14:35 +01:00
|
|
|
WHERE clause (if any) is true, the
|
1998-07-14 05:47:34 +02:00
|
|
|
<replaceable class="parameter">action</replaceable> part of the rule is
|
2001-01-06 05:14:35 +01:00
|
|
|
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
|
2000-04-12 22:07:13 +02:00
|
|
|
<literal>old.</literal><replaceable class="parameter">attribute-name</replaceable>
|
1998-07-14 05:47:34 +02:00
|
|
|
and <literal>new.</literal><replaceable class="parameter">attribute-name</replaceable>.
|
|
|
|
</para>
|
1999-07-22 17:09:15 +02:00
|
|
|
|
2001-01-06 05:14:35 +01:00
|
|
|
<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.
|
|
|
|
</para>
|
|
|
|
|
1998-07-14 05:47:34 +02:00
|
|
|
<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>
|
|
|
|
|
1999-07-06 19:16:42 +02:00
|
|
|
<refsect2 id="R2-SQL-CREATERULE-3">
|
|
|
|
<refsect2info>
|
2001-01-06 05:14:35 +01:00
|
|
|
<date>2001-01-05</date>
|
1999-07-06 19:16:42 +02:00
|
|
|
</refsect2info>
|
|
|
|
<title>
|
1998-07-14 05:47:34 +02:00
|
|
|
Notes
|
1999-07-06 19:16:42 +02:00
|
|
|
</title>
|
1998-07-14 05:47:34 +02:00
|
|
|
<para>
|
2001-01-06 05:14:35 +01:00
|
|
|
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.
|
|
|
|
</para>
|
1999-07-06 19:16:42 +02:00
|
|
|
|
2001-01-06 05:14:35 +01:00
|
|
|
<para>
|
|
|
|
You must have rule definition access to a class in order
|
|
|
|
to define a rule on it. Use <command>GRANT</command>
|
|
|
|
and <command>REVOKE</command> to change permissions.
|
1998-07-14 05:47:34 +02:00
|
|
|
</para>
|
2001-01-06 05:14:35 +01:00
|
|
|
|
1998-07-14 05:47:34 +02:00
|
|
|
<para>
|
2001-01-06 05:14:35 +01:00
|
|
|
It is very important to take care to avoid circular rules.
|
2000-04-07 21:17:51 +02:00
|
|
|
For example, though each
|
1998-09-16 16:43:12 +02:00
|
|
|
of the following two rule definitions are accepted by
|
1999-07-06 19:16:42 +02:00
|
|
|
<productname>Postgres</productname>, the
|
2000-04-07 21:17:51 +02:00
|
|
|
select command will cause <productname>Postgres</productname> to
|
|
|
|
report an error because the query cycled too many times:
|
1998-10-30 20:34:40 +01:00
|
|
|
|
1998-07-14 05:47:34 +02:00
|
|
|
<example>
|
2000-07-22 04:39:10 +02:00
|
|
|
<title>Example of a circular rewrite rule combination:</title>
|
1998-07-14 05:47:34 +02:00
|
|
|
<programlisting>
|
1999-07-06 19:16:42 +02:00
|
|
|
CREATE RULE bad_rule_combination_1 AS
|
|
|
|
ON SELECT TO emp
|
2000-04-07 19:35:08 +02:00
|
|
|
DO INSTEAD
|
2000-12-12 17:47:52 +01:00
|
|
|
SELECT * FROM toyemp;
|
1999-07-06 19:16:42 +02:00
|
|
|
</programlisting>
|
1998-07-14 05:47:34 +02:00
|
|
|
|
1999-07-06 19:16:42 +02:00
|
|
|
<programlisting>
|
|
|
|
CREATE RULE bad_rule_combination_2 AS
|
|
|
|
ON SELECT TO toyemp
|
2000-04-07 19:35:08 +02:00
|
|
|
DO INSTEAD
|
2000-12-12 17:47:52 +01:00
|
|
|
SELECT * FROM emp;
|
1998-07-14 05:47:34 +02:00
|
|
|
</programlisting>
|
1999-07-06 19:16:42 +02:00
|
|
|
<para>
|
2000-04-07 21:17:51 +02:00
|
|
|
This attempt to select from EMP will cause
|
|
|
|
<productname>Postgres</productname> to issue an error
|
2000-07-22 04:39:10 +02:00
|
|
|
because the queries cycled too many times:
|
1998-07-14 05:47:34 +02:00
|
|
|
<programlisting>
|
1999-07-06 19:16:42 +02:00
|
|
|
SELECT * FROM emp;
|
1998-07-14 05:47:34 +02:00
|
|
|
</programlisting></para>
|
|
|
|
</example>
|
|
|
|
</para>
|
1999-07-06 19:16:42 +02:00
|
|
|
</refsect2>
|
1998-07-14 05:47:34 +02:00
|
|
|
</refsect1>
|
1999-07-06 19:16:42 +02:00
|
|
|
|
|
|
|
<refsect1 id="R1-SQL-CREATERULE-4">
|
|
|
|
<title>
|
1998-07-14 05:47:34 +02:00
|
|
|
Compatibility
|
1999-07-06 19:16:42 +02:00
|
|
|
</title>
|
|
|
|
|
|
|
|
<refsect2 id="R2-SQL-CREATERULE-4">
|
|
|
|
<refsect2info>
|
|
|
|
<date>1998-09-11</date>
|
|
|
|
</refsect2info>
|
|
|
|
<title>
|
1998-07-14 05:47:34 +02:00
|
|
|
SQL92
|
1999-07-06 19:16:42 +02:00
|
|
|
</title>
|
1999-07-22 17:09:15 +02:00
|
|
|
|
1998-07-14 05:47:34 +02:00
|
|
|
<para>
|
1999-07-22 17:09:15 +02:00
|
|
|
<command>CREATE RULE</command> statement is a <productname>Postgres</productname>
|
|
|
|
language extension.
|
1999-07-06 19:16:42 +02:00
|
|
|
There is no <command>CREATE RULE</command> statement in <acronym>SQL92</acronym>.
|
1998-07-14 05:47:34 +02:00
|
|
|
</para>
|
|
|
|
</refsect2>
|
|
|
|
</refsect1>
|
1999-07-06 19:16:42 +02:00
|
|
|
</refentry>
|
1998-07-14 05:47:34 +02:00
|
|
|
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
|
|
Local variables:
|
|
|
|
mode: sgml
|
1999-07-06 19:16:42 +02:00
|
|
|
sgml-omittag:nil
|
1998-07-14 05:47:34 +02:00
|
|
|
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:
|
1998-08-15 09:00:37 +02:00
|
|
|
-->
|