From 4a3bf197eb3ca020bc0eb0d5bc5d3838fd1e6851 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Tue, 6 Nov 2001 23:54:32 +0000
Subject: [PATCH] Add some notes about conditional rules used with views.

---
 doc/src/sgml/ref/create_rule.sgml | 46 +++++++++++++++++++++++++++----
 doc/src/sgml/ref/create_view.sgml | 10 +++++--
 2 files changed, 47 insertions(+), 9 deletions(-)

diff --git a/doc/src/sgml/ref/create_rule.sgml b/doc/src/sgml/ref/create_rule.sgml
index 3d7e53ea527..ee17fbdded1 100644
--- a/doc/src/sgml/ref/create_rule.sgml
+++ b/doc/src/sgml/ref/create_rule.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_rule.sgml,v 1.28 2001/10/09 18:46:00 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_rule.sgml,v 1.29 2001/11/06 23:54:32 tgl Exp $
 Postgres documentation
 -->
 
@@ -196,10 +196,10 @@ CREATE
   
   <refsect2 id="R2-SQL-CREATERULE-3">
    <refsect2info>
-    <date>2001-01-05</date>
+    <date>2001-11-06</date>
    </refsect2info>
    <title>
-    Notes
+    Rules and Views
    </title>
    <para>
     Presently, ON SELECT rules must be unconditional INSTEAD rules and must
@@ -207,10 +207,44 @@ CREATE
     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.
+    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>
@@ -267,7 +301,7 @@ UPDATE mytable SET name = 'foo' WHERE id = 42;
    Compatibility
   </title>
 
-  <refsect2 id="R2-SQL-CREATERULE-4">
+  <refsect2 id="R2-SQL-CREATERULE-5">
    <refsect2info>
     <date>1998-09-11</date>
    </refsect2info>
diff --git a/doc/src/sgml/ref/create_view.sgml b/doc/src/sgml/ref/create_view.sgml
index bb383e41e5e..cc533e1824f 100644
--- a/doc/src/sgml/ref/create_view.sgml
+++ b/doc/src/sgml/ref/create_view.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_view.sgml,v 1.12 2001/09/03 12:57:49 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_view.sgml,v 1.13 2001/11/06 23:54:32 tgl Exp $
 Postgres documentation
 -->
 
@@ -102,7 +102,7 @@ ERROR:  Relation '<replaceable class="parameter">view</replaceable>' already exi
      </varlistentry>
      <varlistentry>
       <term><computeroutput>
-NOTICE create: attribute named "<replaceable class="parameter">column</replaceable>" has an unknown type
+NOTICE:  Attribute '<replaceable class="parameter">column</replaceable>' has an unknown type
        </computeroutput></term>
       <listitem>
        <para>
@@ -149,7 +149,11 @@ CREATE VIEW vista AS SELECT text 'Hello World'
    </title>
 
    <para>
-    Currently, views are read only.
+    Currently, views are read only: the system will not allow an insert,
+    update, or delete on a view.  You can get the effect of an updatable
+    view by creating rules that rewrite inserts, etc. on the view into
+    appropriate actions on other tables.  For more information see
+    <xref linkend="sql-createrule">.
    </para>
 
    <para>
-- 
GitLab