]> granicus.if.org Git - postgresql/commitdiff
Add information_schema.triggered_update_columns
authorPeter Eisentraut <peter_e@gmx.net>
Thu, 31 Dec 2009 14:41:23 +0000 (14:41 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
Thu, 31 Dec 2009 14:41:23 +0000 (14:41 +0000)
This reflects the recently added support for triggers on columns.

doc/src/sgml/information_schema.sgml
src/backend/catalog/information_schema.sql

index ad945c2ea9f52ad083096500936825399624d9d6..4888b647d3ce4141436646a88bcda04c23857edf 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/information_schema.sgml,v 1.43 2009/12/30 22:48:10 petere Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/information_schema.sgml,v 1.44 2009/12/31 14:41:23 petere Exp $ -->
 
 <chapter id="information-schema">
  <title>The Information Schema</title>
@@ -4796,6 +4796,80 @@ ORDER BY c.ordinal_position;
   </table>
  </sect1>
 
+ <sect1 id="infoschema-triggered-update-columns">
+  <title><literal>triggered_update_columns</literal></title>
+
+  <para>
+   For triggers in the current database that specify a column list
+   (like <literal>UPDATE OF column1, column2</literal>), the
+   view <literal>triggered_update_columns</literal> identifies these
+   columns.  Triggers that do not specify a column list are not
+   included in this view.  Only those columns are shown that the
+   current user owns or has some non-SELECT privilege on.
+  </para>
+
+  <table>
+   <title><literal>triggered_update_columns</literal> Columns</title>
+
+   <tgroup cols="3">
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Data Type</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry><literal>trigger_catalog</literal></entry>
+      <entry><type>sql_identifier</type></entry>
+      <entry>Name of the database that contains the trigger (always the current database)</entry>
+     </row>
+
+     <row>
+      <entry><literal>trigger_schema</literal></entry>
+      <entry><type>sql_identifier</type></entry>
+      <entry>Name of the schema that contains the trigger</entry>
+     </row>
+
+     <row>
+      <entry><literal>trigger_name</literal></entry>
+      <entry><type>sql_identifier</type></entry>
+      <entry>Name of the trigger</entry>
+     </row>
+
+     <row>
+      <entry><literal>event_object_catalog</literal></entry>
+      <entry><type>sql_identifier</type></entry>
+      <entry>
+       Name of the database that contains the table that the trigger
+       is defined on (always the current database)
+      </entry>
+     </row>
+
+     <row>
+      <entry><literal>event_object_schema</literal></entry>
+      <entry><type>sql_identifier</type></entry>
+      <entry>Name of the schema that contains the table that the trigger is defined on</entry>
+     </row>
+
+     <row>
+      <entry><literal>event_object_table</literal></entry>
+      <entry><type>sql_identifier</type></entry>
+      <entry>Name of the table that the trigger is defined on</entry>
+     </row>
+
+     <row>
+      <entry><literal>event_object_column</literal></entry>
+      <entry><type>sql_identifier</type></entry>
+      <entry>Name of the column that the trigger is defined on</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+ </sect1>
+
  <sect1 id="infoschema-triggers">
   <title><literal>triggers</literal></title>
 
index 929535acc5a27175a107df7f1655508589ad1e7c..41911a91a1c3f17a1f2028a61b2b136da906f8b9 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright (c) 2003-2009, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/backend/catalog/information_schema.sql,v 1.61 2009/12/30 22:48:10 petere Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/information_schema.sql,v 1.62 2009/12/31 14:41:23 petere Exp $
  */
 
 /*
@@ -1852,13 +1852,27 @@ GRANT SELECT ON tables TO PUBLIC;
 
 CREATE VIEW triggered_update_columns AS
     SELECT CAST(current_database() AS sql_identifier) AS trigger_catalog,
-           CAST(null AS sql_identifier) AS trigger_schema,
-           CAST(null AS sql_identifier) AS trigger_name,
+           CAST(n.nspname AS sql_identifier) AS trigger_schema,
+           CAST(t.tgname AS sql_identifier) AS trigger_name,
            CAST(current_database() AS sql_identifier) AS event_object_catalog,
-           CAST(null AS sql_identifier) AS event_object_schema,
-           CAST(null AS sql_identifier) AS event_object_table,
-           CAST(null AS sql_identifier) AS event_object_column
-    WHERE false;
+           CAST(n.nspname AS sql_identifier) AS event_object_schema,
+           CAST(c.relname AS sql_identifier) AS event_object_table,
+           CAST(a.attname AS sql_identifier) AS event_object_column
+
+    FROM pg_namespace n, pg_class c, pg_trigger t,
+         (SELECT tgoid, (ta0.tgat).x AS tgattnum, (ta0.tgat).n AS tgattpos
+          FROM (SELECT oid AS tgoid, information_schema._pg_expandarray(tgattr) AS tgat FROM pg_trigger) AS ta0) AS ta,
+         pg_attribute a
+
+    WHERE n.oid = c.relnamespace
+          AND c.oid = t.tgrelid
+          AND t.oid = ta.tgoid
+          AND (a.attrelid, a.attnum) = (t.tgrelid, ta.tgattnum)
+          AND NOT t.tgisconstraint
+          AND (NOT pg_is_other_temp_schema(n.oid))
+          AND (pg_has_role(c.relowner, 'USAGE')
+               -- SELECT privilege omitted, per SQL standard
+               OR has_column_privilege(c.oid, a.attnum, 'INSERT, UPDATE, REFERENCES') );
 
 GRANT SELECT ON triggered_update_columns TO PUBLIC;