mirror of
https://github.com/postgres/postgres.git
synced 2025-06-25 01:02:05 +03:00
Support triggers on views.
This patch adds the SQL-standard concept of an INSTEAD OF trigger, which is fired instead of performing a physical insert/update/delete. The trigger function is passed the entire old and/or new rows of the view, and must figure out what to do to the underlying tables to implement the update. So this feature can be used to implement updatable views using trigger programming style rather than rule hacking. In passing, this patch corrects the names of some columns in the information_schema.triggers view. It seems the SQL committee renamed them somewhere between SQL:99 and SQL:2003. Dean Rasheed, reviewed by Bernd Helmle; some additional hacking by me.
This commit is contained in:
@ -609,7 +609,7 @@ CREATE TYPE greeting AS (
|
||||
who text
|
||||
);
|
||||
</programlisting>
|
||||
|
||||
|
||||
A set result can be returned from a:
|
||||
|
||||
<variablelist>
|
||||
@ -751,8 +751,7 @@ $$ LANGUAGE plpythonu;
|
||||
<para>
|
||||
contains the event as a string:
|
||||
<literal>INSERT</>, <literal>UPDATE</>,
|
||||
<literal>DELETE</>, <literal>TRUNCATE</>,
|
||||
or <literal>UNKNOWN</>.
|
||||
<literal>DELETE</>, or <literal>TRUNCATE</>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@ -761,8 +760,8 @@ $$ LANGUAGE plpythonu;
|
||||
<term><literal>TD["when"]</></term>
|
||||
<listitem>
|
||||
<para>
|
||||
contains one of <literal>BEFORE</>, <literal>AFTER</>,
|
||||
or <literal>UNKNOWN</>.
|
||||
contains one of <literal>BEFORE</>, <literal>AFTER</>, or
|
||||
<literal>INSTEAD OF</>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@ -771,8 +770,7 @@ $$ LANGUAGE plpythonu;
|
||||
<term><literal>TD["level"]</></term>
|
||||
<listitem>
|
||||
<para>
|
||||
contains one of <literal>ROW</>,
|
||||
<literal>STATEMENT</>, or <literal>UNKNOWN</>.
|
||||
contains <literal>ROW</> or <literal>STATEMENT</>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@ -838,12 +836,14 @@ $$ LANGUAGE plpythonu;
|
||||
</para>
|
||||
|
||||
<para>
|
||||
If <literal>TD["when"]</literal> is <literal>BEFORE</> and
|
||||
If <literal>TD["when"]</literal> is <literal>BEFORE</> or
|
||||
<literal>INSTEAD OF</> and
|
||||
<literal>TD["level"]</literal> is <literal>ROW</>, you can
|
||||
return <literal>None</literal> or <literal>"OK"</literal> from the
|
||||
Python function to indicate the row is unmodified,
|
||||
<literal>"SKIP"</> to abort the event, or <literal>"MODIFY"</> to
|
||||
indicate you've modified the row.
|
||||
<literal>"SKIP"</> to abort the event, or if <literal>TD["event"]</>
|
||||
is <command>INSERT</> or <command>UPDATE</> you can return
|
||||
<literal>"MODIFY"</> to indicate you've modified the new row.
|
||||
Otherwise the return value is ignored.
|
||||
</para>
|
||||
</sect1>
|
||||
|
Reference in New Issue
Block a user