DDL 触发器函数
pg_event_trigger_ddl_commands()
描述:在 ddl_command_end 类型的 DDL 触发器中,该函数用于报告运行中的 DDL 命令。
参数:空
该函数仅能用于 ddl_command_end 类型的 DDL 触发器。
返回值类型:
属性列名 数据类型 说明 classid oid 对象所属的目录的 OID objid oid 对象自身的 OID objsubid int4 对象的子 ID command_tag text 命令标签 object_type text 对象的类型 schema_name text 该对象所属的模式的名称,如果没有则返回 NULL。返回结果不包含引号。 object_identity text 返回文本格式的对象标识,含模式名。 in_extension bool 如果该命令是扩展脚本的一部分则返回 TRUE。 command pg_ddl_command 将该命令以内部格式形式表达,不可被直接输出, 但可将其传递给其他函数,以获得有关于该命令不同部分的信息。 示例:
1、创建触发器函数,返回触发 DDL 命令的 object_identity 属性。
CREATE OR REPLACE FUNCTION ddl_command_test() RETURNS event_trigger AS $$ DECLARE obj record; BEGIN FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP RAISE NOTICE 'command: %', obj.object_identity; RAISE NOTICE 'triggered'; END LOOP; END; $$ LANGUAGE plpgsql;
2、创建 DDL 触发器。
CREATE EVENT TRIGGER ddl_trigger_test1 ON ddl_command_end EXECUTE PROCEDURE ddl_command_test();
3、创建测试表,查看返回结果。
create table ddl_trigger_emp1(id int,name varchar(20));
返回结果如下:
NOTICE: command: public.ddl_trigger_emp1 NOTICE: triggered CREATE TABLE
pg_event_trigger_dropped_objects()
描述:在 sql_drop 类型的 DDL 触发器中,让被删除的对象列表对用户可见。
参数:空
说明:该函数仅能用于 sql_drop 类型的 DDL 触发器。
返回值类型:
属性列名 数据类型 说明 classid oid 对象所属的目录的 OID。 objid oid 对象自身的 OID。 objsubid int4 对象的子 ID。 original boolean 如果删除的是一个根对象则返回 TRUE。 normal boolean 指示该对象是否存在依赖关系,如果该对象的依赖关系图中存在正常的依赖关系,则返回 TRUE。 is_temporary boolean 如果该对象是一个临时对象则返回 TRUE。 object_type text 该对象所属的模式的名称,如果没有则返回 NULL。返回结果不包含引号。 schema_name text 对象所属模式的名称(如果存在);否则为NULL。不应用引用。 object_name text 如果模式和名称的组合能被用于对象的一个唯一标识符,则是对象的名称;否则是NULL。不应用引用,并且名称不是模式限定的。 object_identity text 返回文本格式的对象标识,含模式名。 address_names text array 可用于和 object_type 及 address_args 一起通过 pg_get_object_address() 函数在一台包含有同类相同名称对象的远程服务器上重建该对象地址。 address_args text array 包含 address_names 的补充信息。 示例:
1、创建触发器函数,在删除表后,将表信息记录到 drop_objects 表中。
CREATE OR REPLACE 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; $$;
2、创建触发器。
CREATE EVENT TRIGGER ddl_trigger_test2 ON sql_drop EXECUTE PROCEDURE test_event_trigger_for_drops();
3、创建测试表。
create table ddl_trigger_emp2(id int,name varchar(20));
4、删除测试表。
DROP TABLE ddl_trigger_emp2;
回显信息如下:
NOTICE: DROP TABLE dropped object: table public.ddl_trigger_emp2 public.ddl_trigger_emp2 NOTICE: DROP TABLE dropped object: type public.ddl_trigger_emp2 public.ddl_trigger_emp2 NOTICE: DROP TABLE dropped object: type public._ddl_trigger_emp2 public.ddl_trigger_emp2[] DROP TABLE
pg_event_trigger_table_rewrite_oid()
描述:在table_rewrite 类型的 DDL 触发器中,让被重写的对象oid对用户可见。
参数:空
说明: 该函数仅用于 table_rewrite 类型的 DDL 触发器。
返回值类型:oid
示例:
1、创建触发器函数。
CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger LANGUAGE plpgsql AS $$ BEGIN RAISE NOTICE 'Table ''%'' is being rewritten (reason = %)', pg_event_trigger_table_rewrite_oid()::regclass, pg_event_trigger_table_rewrite_reason(); END; $$;
2、创建触发器。
CREATE EVENT TRIGGER ddl_trigger_test3 ON table_rewrite EXECUTE PROCEDURE test_evtrig_no_rewrite();
3、创建测试表。
create table ddl_trigger_emp3(id int,name varchar(20));
4、修改测试表
alter table ddl_trigger_emp3 drop column name;
回显信息如下:
NOTICE: ALTER TABLE dropped object: table column public.<NULL> public.ddl_trigger_emp3.name ALTER TABLE
pg_event_trigger_table_rewrite_reason()
描述:在 table_rewrite 类型的 DDL 触发器中,让被重写的对象的重写原因对用户可见。
参数:空
说明: 该函数仅用于 table_rewrite 类型的 DDL 触发器。
返回值类型:int4
示例:
1、创建触发器函数。
CREATE OR REPLACE FUNCTION test_event_trigger_no_rewrite() RETURNS event_trigger LANGUAGE plpgsql AS $$ BEGIN RAISE NOTICE 'Table ''%'' is being rewritten (reason = %)', pg_event_trigger_table_rewrite_oid()::regclass, pg_event_trigger_table_rewrite_reason(); END; $$;
2、创建触发器。
CREATE EVENT TRIGGER ddl_trigger_test4 ON table_rewrite EXECUTE PROCEDURE test_event_trigger_no_rewrite();
3、创建测试表。
create table ddl_trigger_emp4(id int,name varchar(20));
4、修改测试表
alter table ddl_trigger_emp4 drop column name;
回显信息如下:
NOTICE: ALTER TABLE dropped object: table column public.<NULL> public.ddl_trigger_emp4.name ALTER TABLE