如何知道 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 的修改日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取联系人列表的最后修改日期(添加/删除/修改)

SQLServer如何修改一列的列名呢?

SQLServer如何修改一列的列名呢?

excel怎么批量修改一格中的日期时间不修改分秒?

如何在 iPhone 上设置 attributesOfItemAtPath(如修改日期/时间)

如何在 Jekyll 中显示文件的修改日期?