在Postgres 9.5有一个函数pg_event_trigger_ddl_commands()
可以在事件触发器中使用以获取插入/更改对象的oid。
日志表:
create table function_log (
datetime timestamp,
schema_name text,
function_name text,
tag text,
function_body text);
事件功能和触发:
create or replace function public.on_function_event()
returns event_trigger
language plpgsql
as $function$
begin
insert into function_log
select now(), nspname, proname, command_tag, prosrc
from pg_event_trigger_ddl_commands() e
join pg_proc p on p.oid = e.objid
join pg_namespace n on n.oid = pronamespace;
end
$function$;
create event trigger on_function_event
on ddl_command_end
when tag in ('CREATE FUNCTION', 'ALTER FUNCTION')
execute procedure on_function_event();
例子:
create or replace function test()
returns int as $$ select 1; $$ language sql;
create or replace function test()
returns int as $$ select 2; $$ language sql;
alter function test() immutable;
select *
from function_log;
datetime | schema_name | function_name | tag | function_body
----------------------------+-------------+---------------+-----------------+---------------
2017-02-26 13:05:15.353879 | public | test | CREATE FUNCTION | select 1;
2017-02-26 13:05:15.353879 | public | test | CREATE FUNCTION | select 2;
2017-02-26 13:05:15.353879 | public | test | ALTER FUNCTION | select 2;
(3 rows)
可以DROP FUNCTION
命令标签添加到扳机,然后使用功能pg_event_trigger_dropped_objects()
以类似于pg_event_trigger_ddl_commands()
的方式。
遗憾的是,在Postgres 9.4中没有pg_event_trigger_ddl_commands()
。您可以尝试使用current_query()
获取插入/更改的对象,或在C
中写入触发器函数。我认为更简单的方法是将Postgres升级到9.5+。
感谢您的解决方案。你可以请建议,如果我可以在数据库表中存储日志。 – Tajinder
既然pg_dump不能保证像函数这样的东西排序,那么你认为信噪比会是多少? –
我的第一个回答是'pg_dump',可能太笼统了,所以我完全修改了答案。 – klin