diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2013-03-27 16:02:10 -0300 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2013-03-28 13:05:48 -0300 |
commit | 473ab40c8bb3fcb1a7645f6a7443a0424d70fbaf (patch) | |
tree | ae120d646f087838e447c764027b3f6415427472 /doc/src | |
parent | 593c39d156fd13e07dbfc43e63b53a3e89e82aa4 (diff) | |
download | postgresql-473ab40c8bb3fcb1a7645f6a7443a0424d70fbaf.tar.gz postgresql-473ab40c8bb3fcb1a7645f6a7443a0424d70fbaf.zip |
Add sql_drop event for event triggers
This event takes place just before ddl_command_end, and is fired if and
only if at least one object has been dropped by the command. (For
instance, DROP TABLE IF EXISTS of a table that does not in fact exist
will not lead to such a trigger firing). Commands that drop multiple
objects (such as DROP SCHEMA or DROP OWNED BY) will cause a single event
to fire. Some firings might be surprising, such as
ALTER TABLE DROP COLUMN.
The trigger is fired after the drop has taken place, because that has
been deemed the safest design, to avoid exposing possibly-inconsistent
internal state (system catalogs as well as current transaction) to the
user function code. This means that careful tracking of object
identification is required during the object removal phase.
Like other currently existing events, there is support for tag
filtering.
To support the new event, add a new pg_event_trigger_dropped_objects()
set-returning function, which returns a set of rows comprising the
objects affected by the command. This is to be used within the user
function code, and is mostly modelled after the recently introduced
pg_identify_object() function.
Catalog version bumped due to the new function.
Dimitri Fontaine and Álvaro Herrera
Review by Robert Haas, Tom Lane
Diffstat (limited to 'doc/src')
-rw-r--r-- | doc/src/sgml/event-trigger.sgml | 110 | ||||
-rw-r--r-- | doc/src/sgml/func.sgml | 113 |
2 files changed, 218 insertions, 5 deletions
diff --git a/doc/src/sgml/event-trigger.sgml b/doc/src/sgml/event-trigger.sgml index 71241c82245..36928413d15 100644 --- a/doc/src/sgml/event-trigger.sgml +++ b/doc/src/sgml/event-trigger.sgml @@ -27,17 +27,19 @@ <para> An event trigger fires whenever the event with which it is associated occurs in the database in which it is defined. Currently, the only - supported events are <literal>ddl_command_start</> - and <literal>ddl_command_end</>. Support for additional events may be - added in future releases. + supported events are + <literal>ddl_command_start</>, + <literal>ddl_command_end</> + and <literal>sql_drop</>. + Support for additional events may be added in future releases. </para> <para> The <literal>ddl_command_start</> event occurs just before the execution of a <literal>CREATE</>, <literal>ALTER</>, or <literal>DROP</> command. As an exception, however, this event does not occur for - DDL commands targeting shared objects - databases, roles, and tablespaces - - or for command targeting event triggers themselves. The event trigger + DDL commands targeting shared objects — databases, roles, and tablespaces + — or for command targeting event triggers themselves. The event trigger mechanism does not support these object types. <literal>ddl_command_start</> also occurs just before the execution of a <literal>SELECT INTO</literal> command, since this is equivalent to @@ -46,6 +48,17 @@ </para> <para> + The <literal>sql_drop</> event occurs just before the + <literal>ddl_command_end</> event trigger for any operation that drops + database objects. To list the objects that have been dropped, use the set + returning function <literal>pg_event_trigger_dropped_objects()</> from your + <literal>sql_drop</> event trigger code (see + <xref linkend="functions-event-triggers">). Note that + the trigger is executed after the objects have been deleted from the + system catalogs, so it's not possible to look them up anymore. + </para> + + <para> Event triggers (like other functions) cannot be executed in an aborted transaction. Thus, if a DDL command fails with an error, any associated <literal>ddl_command_end</> triggers will not be executed. Conversely, @@ -99,6 +112,7 @@ <entry>command tag</entry> <entry><literal>ddl_command_start</literal></entry> <entry><literal>ddl_command_end</literal></entry> + <entry><literal>sql_drop</literal></entry> </row> </thead> <tbody> @@ -106,401 +120,487 @@ <entry align="left"><literal>ALTER AGGREGATE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER COLLATION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER CONVERSION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER DOMAIN</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER EXTENSION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER FOREIGN DATA WRAPPER</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER FOREIGN TABLE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>ALTER FUNCTION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER LANGUAGE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER OPERATOR</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER OPERATOR CLASS</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER OPERATOR FAMILY</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER SCHEMA</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER SEQUENCE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER SERVER</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER TABLE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>ALTER TEXT SEARCH CONFIGURATION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER TEXT SEARCH DICTIONARY</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER TEXT SEARCH PARSER</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER TEXT SEARCH TEMPLATE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER TRIGGER</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER TYPE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER USER MAPPING</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>ALTER VIEW</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE AGGREGATE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE CAST</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE COLLATION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE CONVERSION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE DOMAIN</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE EXTENSION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE FOREIGN DATA WRAPPER</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE FOREIGN TABLE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE FUNCTION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE INDEX</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE LANGUAGE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE OPERATOR</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE OPERATOR CLASS</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE OPERATOR FAMILY</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE RULE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE SCHEMA</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE SEQUENCE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE SERVER</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE TABLE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE TABLE AS</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE TEXT SEARCH CONFIGURATION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE TEXT SEARCH DICTIONARY</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE TEXT SEARCH PARSER</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE TEXT SEARCH TEMPLATE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE TRIGGER</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE TYPE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE USER MAPPING</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>CREATE VIEW</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> <row> <entry align="left"><literal>DROP AGGREGATE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP CAST</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP COLLATION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP CONVERSION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP DOMAIN</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP EXTENSION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP FOREIGN DATA WRAPPER</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP FOREIGN TABLE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP FUNCTION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP INDEX</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP LANGUAGE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP OPERATOR</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP OPERATOR CLASS</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP OPERATOR FAMILY</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> + </row> + <row> + <entry align="left"><literal>DROP OWNED</literal></entry> + <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP RULE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP SCHEMA</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP SEQUENCE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP SERVER</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP TABLE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP TEXT SEARCH CONFIGURATION</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP TEXT SEARCH DICTIONARY</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP TEXT SEARCH PARSER</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP TEXT SEARCH TEMPLATE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP TRIGGER</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP TYPE</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP USER MAPPING</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>DROP VIEW</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>X</literal></entry> </row> <row> <entry align="left"><literal>SELECT INTO</literal></entry> <entry align="center"><literal>X</literal></entry> <entry align="center"><literal>X</literal></entry> + <entry align="center"><literal>-</literal></entry> </row> </tbody> </tgroup> diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 490d7106435..db4e33f871d 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -15980,4 +15980,117 @@ FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); <xref linkend="SQL-CREATETRIGGER">. </para> </sect1> + + <sect1 id="functions-event-triggers"> + <title>Event Trigger Functions</title> + + <indexterm> + <primary>pg_event_trigger_dropped_objects</primary> + </indexterm> + + <para> + Currently <productname>PostgreSQL</> provides one built-in event trigger + helper function, <function>pg_event_trigger_dropped_objects</>. + </para> + + <para> + <function>pg_event_trigger_dropped_objects</> returns a list of all object + dropped by the command in whose <literal>sql_drop</> event it is called. + If called in any other context, + <function>pg_event_trigger_dropped_objects</> raises an error. + <function>pg_event_trigger_dropped_objects</> returns the following columns: + + <informaltable> + <tgroup cols="3"> + <thead> + <row> + <entry>Name</entry> + <entry>Type</entry> + <entry>Description</entry> + </row> + </thead> + + <tbody> + <row> + <entry><literal>classid</literal></entry> + <entry><type>Oid</type></entry> + <entry>OID of catalog the object belonged in</entry> + </row> + <row> + <entry><literal>objid</literal></entry> + <entry><type>Oid</type></entry> + <entry>OID the object had within the catalog</entry> + </row> + <row> + <entry><literal>objsubid</literal></entry> + <entry><type>int32</type></entry> + <entry>Object sub-id (e.g. attribute number for columns)</entry> + </row> + <row> + <entry><literal>object_type</literal></entry> + <entry><type>text</type></entry> + <entry>Type of the object</entry> + </row> + <row> + <entry><literal>schema_name</literal></entry> + <entry><type>text</type></entry> + <entry> + Name of the schema the object belonged in, if any; otherwise <literal>NULL</>. + No quoting is applied. + </entry> + </row> + <row> + <entry><literal>object_name</literal></entry> + <entry><type>text</type></entry> + <entry> + Name of the object, if the combination of schema and name can be + used as an unique identifier for the object; otherwise <literal>NULL</>. + No quoting is applied, and name is never schema-qualified. + </entry> + </row> + <row> + <entry><literal>object_identity</literal></entry> + <entry><type>text</type></entry> + <entry> + Text rendering of the object identity, schema-qualified. Each and every + identifier present in the identity is quoted if necessary. + </entry> + </row> + </tbody> + </tgroup> + </informaltable> + </para> + + <para> + The <function>pg_event_trigger_dropped_objects</> function can be used + in an event trigger like this: +<programlisting> +CREATE FUNCTION test_event_trigger_for_drops() + RETURNS event_trigger LANGUAGE plpgsql AS $$ +DECLARE + obj record; +BEGIN + FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects() + LOOP + RAISE NOTICE '% dropped object: % %.% %', + tg_tag, + obj.object_type, + obj.schema_name, + obj.object_name, + obj.object_identity; + END LOOP; +END +$$; +CREATE EVENT TRIGGER test_event_trigger_for_drops + ON sql_drop + EXECUTE PROCEDURE test_event_trigger_for_drops(); +</programlisting> + </para> + + <para> + For more information about event triggers, + see <xref linkend="event-triggers">. + </para> + </sect1> + </chapter> |