Home Explore Blog CI



postgresql

1st chunk of `doc/src/sgml/ref/create_rule.sgml`
4fd7f18951f3b2c5a3fe2ff4390ed419538805ab9d386e730000000100000fa2
<!--
doc/src/sgml/ref/create_rule.sgml
PostgreSQL documentation
-->

<refentry id="sql-createrule">
 <indexterm zone="sql-createrule">
  <primary>CREATE RULE</primary>
 </indexterm>

 <refmeta>
  <refentrytitle>CREATE RULE</refentrytitle>
  <manvolnum>7</manvolnum>
  <refmiscinfo>SQL - Language Statements</refmiscinfo>
 </refmeta>

 <refnamediv>
  <refname>CREATE RULE</refname>
  <refpurpose>define a new rewrite rule</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
<synopsis>
CREATE [ OR REPLACE ] RULE <replaceable class="parameter">name</replaceable> AS ON <replaceable class="parameter">event</replaceable>
    TO <replaceable class="parameter">table_name</replaceable> [ WHERE <replaceable class="parameter">condition</replaceable> ]
    DO [ ALSO | INSTEAD ] { NOTHING | <replaceable class="parameter">command</replaceable> | ( <replaceable class="parameter">command</replaceable> ; <replaceable class="parameter">command</replaceable> ... ) }

<phrase>where <replaceable class="parameter">event</replaceable> can be one of:</phrase>

    SELECT | INSERT | UPDATE | DELETE
</synopsis>
 </refsynopsisdiv>

 <refsect1>
  <title>Description</title>

  <para>
   <command>CREATE RULE</command> defines a new rule applying to a specified
   table or view.
   <command>CREATE OR REPLACE RULE</command> will either create a
   new rule, or replace an existing rule of the same name for the same
   table.
  </para>

  <para>
   The <productname>PostgreSQL</productname> rule system allows one to
   define an alternative action to be performed on insertions, updates,
   or deletions in database tables.  Roughly speaking, a rule causes
   additional commands to be executed when a given command on a given
   table is executed.  Alternatively, an <literal>INSTEAD</literal>
   rule can replace a given command by another, or cause a command
   not to be executed at all.  Rules are used to implement SQL
   views as well.  It is important to realize that a rule is really
   a command transformation mechanism, or command macro.  The
   transformation happens before the execution of the command starts.
   If you actually want an operation that fires independently for each
   physical row, you probably want to use a trigger, not a rule.
   More information about the rules system is in <xref linkend="rules"/>.
  </para>

  <para>
   Presently, <literal>ON SELECT</literal> rules can only be attached
   to views.  Such a rule must be named <literal>"_RETURN"</literal>,
   must be an unconditional <literal>INSTEAD</literal> rule, and must have
   an action that consists of a single <command>SELECT</command> command.
   This command defines the visible contents of the view.  (The view
   itself is basically a dummy table with no storage.)  It's best to
   regard such a rule as an implementation detail.  While a view can be
   redefined via <literal>CREATE OR REPLACE RULE "_RETURN" AS
   ...</literal>, it's better style to use <literal>CREATE OR REPLACE
   VIEW</literal>.
  </para>

  <para>
   You can create the illusion of an updatable view by defining
   <literal>ON INSERT</literal>, <literal>ON UPDATE</literal>, and
   <literal>ON DELETE</literal> 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.  If you want to support
   <command>INSERT RETURNING</command> and so on, then be sure to put a suitable
   <literal>RETURNING</literal> clause into each of these rules.
  </para>

  <para>
   There is a catch if you try to use conditional rules for complex view
   updates: there <emphasis>must</emphasis> be an unconditional
   <literal>INSTEAD</literal> rule for each action you wish to allow
   on the view.  If the rule is conditional, or is not
   <literal>INSTEAD</literal>, 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 of the view
   in some cases.  If you

Title: CREATE RULE
Summary
The CREATE RULE command defines a new rule for a specified table or view, allowing alternative actions to be performed on insertions, updates, or deletions. Rules can either add commands or replace them entirely using the INSTEAD option. ON SELECT rules are specifically used for defining the contents of views and must be named "_RETURN", be unconditional INSTEAD rules, and consist of a single SELECT command. Updatable views can be simulated by defining ON INSERT, ON UPDATE, and ON DELETE rules to redirect update actions to other tables.