sql - 如何跟踪 PostgreSQL 中任何函数的变化

标签 sql postgresql triggers postgresql-9.4

我想跟踪 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/

相关文章:

mysql在函数中附加带有整数的字符返回0

sql - Oracle 中的 UPDATE 语句

sql - 删除的 SQL 条目是否仍然占用空间/行?

azure - Azure SQL 中使用审核的事件警报

google-apps-script - Google Spreadsheet Script onChange事件未触发

mysql - 如何打开并使用转储中生成的非常大的 .SQL 文件?

c# - 如何显示自指表?

java - 如何在 Spring Boot 的 native 查询中使用 all(array[])?

ruby-on-rails - 避免 Rails 多表查询中的 N+1 查询

php - Symfony 数据库和触发器