summaryrefslogtreecommitdiff
path: root/doc/src/sgml/ref
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/sgml/ref')
-rw-r--r--doc/src/sgml/ref/create_rule.sgml10
-rw-r--r--doc/src/sgml/ref/create_trigger.sgml106
2 files changed, 100 insertions, 16 deletions
diff --git a/doc/src/sgml/ref/create_rule.sgml b/doc/src/sgml/ref/create_rule.sgml
index 5d2182c2ca..e7c88497d6 100644
--- a/doc/src/sgml/ref/create_rule.sgml
+++ b/doc/src/sgml/ref/create_rule.sgml
@@ -53,7 +53,7 @@ CREATE [ OR REPLACE ] RULE <replaceable class="parameter">name</replaceable> AS
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 must be unconditional
<literal>INSTEAD</literal> rules and must have actions that consist
@@ -73,7 +73,9 @@ CREATE [ OR REPLACE ] RULE <replaceable class="parameter">name</replaceable> AS
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</> and so on, then be sure to put a suitable
- <literal>RETURNING</> clause into each of these rules.
+ <literal>RETURNING</> clause into each of these rules. Alternatively,
+ an updatable view can be implemented using <literal>INSTEAD OF</>
+ triggers (see <xref linkend="sql-createtrigger">).
</para>
<para>
@@ -232,12 +234,12 @@ CREATE [ OR REPLACE ] RULE <replaceable class="parameter">name</replaceable> AS
<programlisting>
CREATE RULE "_RETURN" AS
ON SELECT TO t1
- DO INSTEAD
+ DO INSTEAD
SELECT * FROM t2;
CREATE RULE "_RETURN" AS
ON SELECT TO t2
- DO INSTEAD
+ DO INSTEAD
SELECT * FROM t1;
SELECT * FROM t1;
diff --git a/doc/src/sgml/ref/create_trigger.sgml b/doc/src/sgml/ref/create_trigger.sgml
index 1934113181..95d67aad6f 100644
--- a/doc/src/sgml/ref/create_trigger.sgml
+++ b/doc/src/sgml/ref/create_trigger.sgml
@@ -21,7 +21,7 @@ PostgreSQL documentation
<refsynopsisdiv>
<synopsis>
-CREATE TRIGGER <replaceable class="PARAMETER">name</replaceable> { BEFORE | AFTER } { <replaceable class="PARAMETER">event</replaceable> [ OR ... ] }
+CREATE TRIGGER <replaceable class="PARAMETER">name</replaceable> { BEFORE | AFTER | INSTEAD OF } { <replaceable class="PARAMETER">event</replaceable> [ OR ... ] }
ON <replaceable class="PARAMETER">table</replaceable> [ FOR [ EACH ] { ROW | STATEMENT } ]
[ WHEN ( <replaceable class="parameter">condition</replaceable> ) ]
EXECUTE PROCEDURE <replaceable class="PARAMETER">function_name</replaceable> ( <replaceable class="PARAMETER">arguments</replaceable> )
@@ -33,21 +33,22 @@ CREATE TRIGGER <replaceable class="PARAMETER">name</replaceable> { BEFORE | AFTE
<para>
<command>CREATE TRIGGER</command> creates a new trigger. The
- trigger will be associated with the specified table and will
+ trigger will be associated with the specified table or view and will
execute the specified function <replaceable
class="parameter">function_name</replaceable> when certain events occur.
</para>
<para>
- The trigger can be specified to fire either before the
+ The trigger can be specified to fire before the
operation is attempted on a row (before constraints are checked and
the <command>INSERT</command>, <command>UPDATE</command>, or
- <command>DELETE</command> is attempted) or after the operation has
+ <command>DELETE</command> is attempted); or after the operation has
completed (after constraints are checked and the
<command>INSERT</command>, <command>UPDATE</command>, or
- <command>DELETE</command> has completed). If the trigger fires
- before the event, the trigger can skip the operation for the
- current row, or change the row being inserted (for
+ <command>DELETE</command> has completed); or instead of the operation
+ (in the case of inserts, updates or deletes on a view).
+ If the trigger fires before or instead of the event, the trigger can skip
+ the operation for the current row, or change the row being inserted (for
<command>INSERT</command> and <command>UPDATE</command> operations
only). If the trigger fires after the event, all changes, including
the effects of other triggers, are <quote>visible</quote>
@@ -68,12 +69,72 @@ CREATE TRIGGER <replaceable class="PARAMETER">name</replaceable> { BEFORE | AFTE
</para>
<para>
- In addition, triggers may be defined to fire for a
+ Triggers that are specified to fire <literal>INSTEAD OF</> the trigger
+ event must be marked <literal>FOR EACH ROW</>, and can only be defined
+ on views. <literal>BEFORE</> and <literal>AFTER</> triggers on a view
+ must be marked as <literal>FOR EACH STATEMENT</>.
+ </para>
+
+ <para>
+ In addition, triggers may be defined to fire for
<command>TRUNCATE</command>, though only
<literal>FOR EACH STATEMENT</literal>.
</para>
<para>
+ The following table summarizes which types of triggers may be used on
+ tables and views:
+ </para>
+
+ <informaltable id="supported-trigger-types">
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>When</entry>
+ <entry>Event</entry>
+ <entry>Row-level</entry>
+ <entry>Statement-level</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry align="center" morerows="1"><literal>BEFORE</></entry>
+ <entry align="center"><command>INSERT</>/<command>UPDATE</>/<command>DELETE</></entry>
+ <entry align="center">Tables</entry>
+ <entry align="center">Tables and views</entry>
+ </row>
+ <row>
+ <entry align="center"><command>TRUNCATE</></entry>
+ <entry align="center">&mdash;</entry>
+ <entry align="center">Tables</entry>
+ </row>
+ <row>
+ <entry align="center" morerows="1"><literal>AFTER</></entry>
+ <entry align="center"><command>INSERT</>/<command>UPDATE</>/<command>DELETE</></entry>
+ <entry align="center">Tables</entry>
+ <entry align="center">Tables and views</entry>
+ </row>
+ <row>
+ <entry align="center"><command>TRUNCATE</></entry>
+ <entry align="center">&mdash;</entry>
+ <entry align="center">Tables</entry>
+ </row>
+ <row>
+ <entry align="center" morerows="1"><literal>INSTEAD OF</></entry>
+ <entry align="center"><command>INSERT</>/<command>UPDATE</>/<command>DELETE</></entry>
+ <entry align="center">Views</entry>
+ <entry align="center">&mdash;</entry>
+ </row>
+ <row>
+ <entry align="center"><command>TRUNCATE</></entry>
+ <entry align="center">&mdash;</entry>
+ <entry align="center">&mdash;</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
Also, a trigger definition can specify a Boolean <literal>WHEN</>
condition, which will be tested to see whether the trigger should
be fired. In row-level triggers the <literal>WHEN</> condition can
@@ -116,10 +177,11 @@ CREATE TRIGGER <replaceable class="PARAMETER">name</replaceable> { BEFORE | AFTE
<varlistentry>
<term><literal>BEFORE</literal></term>
<term><literal>AFTER</literal></term>
+ <term><literal>INSTEAD OF</literal></term>
<listitem>
<para>
- Determines whether the function is called before or after the
- event.
+ Determines whether the function is called before, after, or instead of
+ the event.
</para>
</listitem>
</varlistentry>
@@ -143,6 +205,10 @@ UPDATE OF <replaceable>column_name1</replaceable> [, <replaceable>column_name2</
The trigger will only fire if at least one of the listed columns
is mentioned as a target of the update.
</para>
+
+ <para>
+ <literal>UPDATE INSTEAD OF</> triggers do not support lists of columns.
+ </para>
</listitem>
</varlistentry>
@@ -150,7 +216,7 @@ UPDATE OF <replaceable>column_name1</replaceable> [, <replaceable>column_name2</
<term><replaceable class="parameter">table</replaceable></term>
<listitem>
<para>
- The name (optionally schema-qualified) of the table the trigger
+ The name (optionally schema-qualified) of the table or view the trigger
is for.
</para>
</listitem>
@@ -189,6 +255,11 @@ UPDATE OF <replaceable>column_name1</replaceable> [, <replaceable>column_name2</
</para>
<para>
+ <literal>INSTEAD OF</> triggers do not support <literal>WHEN</>
+ conditions.
+ </para>
+
+ <para>
Currently, <literal>WHEN</literal> expressions cannot contain
subqueries.
</para>
@@ -326,6 +397,16 @@ CREATE TRIGGER log_update
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE PROCEDURE log_account_update();
</programlisting>
+
+ Execute the function <function>view_insert_row</> for each row to insert
+ rows into the tables underlying a view:
+
+<programlisting>
+CREATE TRIGGER view_insert
+ INSTEAD OF INSERT ON my_view
+ FOR EACH ROW
+ EXECUTE PROCEDURE view_insert_row();
+</programlisting>
</para>
<para>
@@ -396,7 +477,8 @@ CREATE TRIGGER log_update
<para>
The ability to fire triggers for <command>TRUNCATE</command> is a
- <productname>PostgreSQL</> extension of the SQL standard.
+ <productname>PostgreSQL</> extension of the SQL standard, as is the
+ ability to define statement-level triggers on views.
</para>
</refsect1>