mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Event Trigger for table_rewrite
Generate a table_rewrite event when ALTER TABLE attempts to rewrite a table. Provide helper functions to identify table and reason. Intended use case is to help assess or to react to schema changes that might hold exclusive locks for long periods. Dimitri Fontaine, triggering an edit by Simon Riggs Reviewed in detail by Michael Paquier
This commit is contained in:
@ -64,6 +64,16 @@
|
||||
system catalogs, so it's not possible to look them up anymore.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The <literal>table_rewrite</> event occurs just before a table is
|
||||
rewritten by the command <literal>ALTER TABLE</literal>. While other
|
||||
control statements are available to rewrite a table,
|
||||
like <literal>CLUSTER</literal> and <literal>VACUUM</literal>,
|
||||
the <literal>table_rewrite</> event is currently only triggered by
|
||||
the <literal>ALTER TABLE</literal> command, and only when that command
|
||||
attempts to rewrite the table.
|
||||
</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
|
||||
@ -120,6 +130,7 @@
|
||||
<entry><literal>ddl_command_start</literal></entry>
|
||||
<entry><literal>ddl_command_end</literal></entry>
|
||||
<entry><literal>sql_drop</literal></entry>
|
||||
<entry><literal>table_rewrite</literal></entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -128,510 +139,595 @@
|
||||
<entry align="center"><literal>X</literal></entry>
|
||||
<entry align="center"><literal>X</literal></entry>
|
||||
<entry align="center"><literal>-</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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<entry align="center"><literal>-</literal></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry align="left"><literal>ALTER POLICY</literal></entry>
|
||||
<entry align="center"><literal>X</literal></entry>
|
||||
<entry align="center"><literal>X</literal></entry>
|
||||
<entry align="center"><literal>-</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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<entry align="center"><literal>-</literal></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry align="left"><literal>CREATE POLICY</literal></entry>
|
||||
<entry align="center"><literal>X</literal></entry>
|
||||
<entry align="center"><literal>X</literal></entry>
|
||||
<entry align="center"><literal>-</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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</literal></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry align="left"><literal>DROP POLICY</literal></entry>
|
||||
<entry align="center"><literal>X</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 RULE</literal></entry>
|
||||
<entry align="center"><literal>X</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 SCHEMA</literal></entry>
|
||||
<entry align="center"><literal>X</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 SEQUENCE</literal></entry>
|
||||
<entry align="center"><literal>X</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 SERVER</literal></entry>
|
||||
<entry align="center"><literal>X</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 TABLE</literal></entry>
|
||||
<entry align="center"><literal>X</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 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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</literal></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry align="left"><literal>IMPORT FOREIGN SCHEMA</literal></entry>
|
||||
<entry align="center"><literal>X</literal></entry>
|
||||
<entry align="center"><literal>X</literal></entry>
|
||||
<entry align="center"><literal>-</literal></entry>
|
||||
<entry align="center"><literal>-</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>
|
||||
<entry align="center"><literal>-</literal></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
@ -843,4 +939,58 @@ COMMIT;
|
||||
event triggers.)
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="event-trigger-table-rewrite-example">
|
||||
<title>A Table Rewrite Event Trigger Example</title>
|
||||
|
||||
<para>
|
||||
Thanks to the <literal>table_rewrite</> event, it is possible to implement
|
||||
a table rewriting policy only allowing the rewrite in maintenance windows.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Here's an example implementing such a policy.
|
||||
<programlisting>
|
||||
CREATE OR REPLACE FUNCTION no_rewrite()
|
||||
RETURNS event_trigger
|
||||
LANGUAGE plpgsql AS
|
||||
$$
|
||||
---
|
||||
--- Implement local Table Rewriting policy:
|
||||
--- public.foo is not allowed rewriting, ever
|
||||
--- other tables are only allowed rewriting between 1am and 6am
|
||||
--- unless they have more than 100 blocks
|
||||
---
|
||||
DECLARE
|
||||
table_oid oid := pg_event_trigger_table_rewrite_oid();
|
||||
current_hour integer := extract('hour' from current_time);
|
||||
pages integer;
|
||||
max_pages integer := 100;
|
||||
BEGIN
|
||||
IF pg_event_trigger_table_rewrite_oid() = 'public.foo'::regclass
|
||||
THEN
|
||||
RAISE EXCEPTION 'you''re not allowed to rewrite the table %',
|
||||
table_oid::regclass;
|
||||
END IF;
|
||||
|
||||
SELECT INTO pages relpages FROM pg_class WHERE oid = table_oid;
|
||||
IF pages > max_pages
|
||||
THEN
|
||||
RAISE EXCEPTION 'rewrites only allowed for table with less than % pages',
|
||||
max_pages;
|
||||
END IF;
|
||||
|
||||
IF current_hour NOT BETWEEN 1 AND 6
|
||||
THEN
|
||||
RAISE EXCEPTION 'rewrites only allowed between 1am and 6am';
|
||||
END IF;
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE EVENT TRIGGER no_rewrite_allowed
|
||||
ON table_rewrite
|
||||
EXECUTE PROCEDURE no_rewrite();
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
@ -17607,15 +17607,23 @@ FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger();
|
||||
<sect1 id="functions-event-triggers">
|
||||
<title>Event Trigger Functions</title>
|
||||
|
||||
<para>
|
||||
<productname>PostgreSQL</> provides these helper functions
|
||||
to retrieve information from event triggers.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For more information about event triggers,
|
||||
see <xref linkend="event-triggers">.
|
||||
</para>
|
||||
|
||||
<sect2 id="pg-event-trigger-sql-drop-functions">
|
||||
<title>Processing objects dropped by a DDL command.</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 objects
|
||||
dropped by the command in whose <literal>sql_drop</> event it is called.
|
||||
@ -17709,11 +17717,72 @@ CREATE EVENT TRIGGER test_event_trigger_for_drops
|
||||
EXECUTE PROCEDURE test_event_trigger_for_drops();
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
<para>
|
||||
For more information about event triggers,
|
||||
see <xref linkend="event-triggers">.
|
||||
<sect2 id="pg-event-trigger-table-rewrite-functions">
|
||||
<title>Handling a Table Rewrite Event</title>
|
||||
|
||||
<para>
|
||||
The functions shown in
|
||||
<xref linkend="functions-event-trigger-table-rewrite">
|
||||
provide information about a table for which a
|
||||
<literal>table_rewrite</> event has just been called.
|
||||
If called in any other context, an error is raised.
|
||||
</para>
|
||||
|
||||
<table id="functions-event-trigger-table-rewrite">
|
||||
<title>Table Rewrite information</title>
|
||||
<tgroup cols="3">
|
||||
<thead>
|
||||
<row><entry>Name</entry> <entry>Return Type</entry> <entry>Description</entry></row>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>
|
||||
<indexterm><primary>pg_event_trigger_table_rewrite_oid</primary></indexterm>
|
||||
<literal><function>pg_event_trigger_table_rewrite_oid()</function></literal>
|
||||
</entry>
|
||||
<entry><type>Oid</type></entry>
|
||||
<entry>The Oid of the table about to be rewritten.</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry>
|
||||
<indexterm><primary>pg_event_trigger_table_rewrite_reason</primary></indexterm>
|
||||
<literal><function>pg_event_trigger_table_rewrite_reason()</function></literal>
|
||||
</entry>
|
||||
<entry><type>int</type></entry>
|
||||
<entry>
|
||||
The reason code(s) explaining the reason for rewriting. The exact
|
||||
meaning of the codes is release dependent.
|
||||
</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
||||
<para>
|
||||
The <function>pg_event_trigger_table_rewrite_oid</> function can be used
|
||||
in an event trigger like this:
|
||||
<programlisting>
|
||||
CREATE FUNCTION test_event_trigger_table_rewrite_oid()
|
||||
RETURNS event_trigger
|
||||
LANGUAGE plpgsql AS
|
||||
$$
|
||||
BEGIN
|
||||
RAISE NOTICE 'rewriting table % for reason %',
|
||||
pg_event_trigger_table_rewrite_oid()::regclass,
|
||||
pg_event_trigger_table_rewrite_reason();
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE EVENT TRIGGER test_table_rewrite_oid
|
||||
ON table_rewrite
|
||||
EXECUTE PROCEDURE test_event_trigger_table_rewrite_oid();
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
</chapter>
|
||||
|
Reference in New Issue
Block a user