如何知道 SP 的修改日期?
Posted
技术标签:
【中文标题】如何知道 SP 的修改日期?【英文标题】:How to know the date of modification of an SP? 【发布时间】:2017-11-22 12:54:36 【问题描述】:是否可以知道 PostgreSQL 9.4 中 SP 的修改和/或创建日期?
我需要识别它们以便在下次部署时上传它们。-
【问题讨论】:
SP 是用户定义的函数?.. ***.com/questions/2577168/… @VaoTsun - 2577168 已过时 - 现在 PostgreSQL 有事件触发器,这个问题可以通过系统函数很好地解决。 @PavelStehule 是的,完全同意,顺便说一句 - 为什么没有人将此修复添加到 2577168?我认为在 postgres 中没有last_ddl
是事件触发之前的一场圣战
@VaoTsun - 部分正确,有一些 C 扩展是可能的,但没有一个干净简单的解决方案。 PostgreSQL 的哲学:“如果你不能正确地做,就什么也不做”。它有优点缺点。
【参考方案1】:
PostgreSQL 没有这个功能。您可以创建自己的表并从 event triggers 更新它。
create table updates(proc regprocedure primary key, t timestamp);
create or replace function event_trigger_for_ddl_command_end()
returns event_trigger as $$
declare obj record;
begin
for obj in select * from pg_event_trigger_ddl_commands()
loop
if obj.classid = 'pg_proc'::regclass then
insert into updates values(obj.objid, current_timestamp)
on conflict (proc) do update set t = current_timestamp
where updates.proc = excluded.proc;
end if;
end loop;
end;
$$ language plpgsql;
create event trigger trigger_for_ddl_command_end
on ddl_command_end
execute procedure event_trigger_for_ddl_command_end();
create or replace function fx(a int) returns int as $$ select 1 $$ language sql;
postgres=# select * from updates ;
+-------------+----------------------------+
| proc | t |
+-------------+----------------------------+
| fx(integer) | 2017-11-22 14:21:11.367036 |
+-------------+----------------------------+
(1 row)
-- alternative code without INSERT ON CONFLICT
create or replace function event_trigger_for_ddl_command_end()
returns event_trigger as $$
declare obj record;
begin
for obj in select * from pg_event_trigger_ddl_commands()
loop
if obj.classid = 'pg_proc'::regclass then
begin
update updates set t = current_timestamp
where proc = obj.objid;
if not found then
begin
insert into updates values(obj.objid, current_timestamp);
exception when unique_violation then
update updates set t = current_timestamp
where proc = obj.objid;
end;
end if;
end if;
end loop;
end;
$$ language plpgsql;
【讨论】:
创建 SP event_trigger_for_ddl_command_end() 时,我得到以下信息:错误:错误 de sintaxis en o cerca de «on» LINE 8: on conflict (proc) do update set t = current_times... @Max 您的 postgres 版本是什么? 我有 PostgreSQL 9.4 @Max 嗯 9.4。不支持INSERT ON CONFLICT
。以上是关于如何知道 SP 的修改日期?的主要内容,如果未能解决你的问题,请参考以下文章