我想跟踪 PostgreSQL 中任何函数的变化。
示例 - 假设我在 postgesql 数据库中有函数 fun_name()
并且我正在对函数进行修改。
现在,我想跟踪这样的记录
DateTime,Schema_name,Function_name,old_func_text,new_func_text
请建议在 postgresql 中实现此目标的最佳方法。
我正在研究 https://www.postgresql.org/docs/9.3/static/sql-createeventtrigger.html 中的事件触发器
谢谢。
最佳答案
在 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_ddl_commands()
的方式使用函数 pg_event_trigger_dropped_objects()
。
不幸的是,Postgres 9.4 中没有pg_event_trigger_ddl_commands()
。您可以尝试使用 current_query()
获取插入/更改的对象或在 C
中编写触发函数。我认为更简单的方法是将 Postgres 升级到 9.5+。
关于sql - 如何跟踪 PostgreSQL 中任何函数的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42455584/