PostgreSQL:表创建时间

时间:2010-04-05 06:20:27

标签: postgresql

如何在Postgresql中找到表创建时间。

示例,

如果我创建了一个文件,我可以找到文件创建时间,就像我想知道表创建时间一样。

8 个答案:

答案 0 :(得分:18)

您不能 - 信息不会记录在任何地方。查看表格文件不一定能为您提供正确的信息 - 有些表操作会为您创建一个新文件,在这种情况下日期会重置。

答案 1 :(得分:15)

我查看了pg_ *表,我在那里找不到任何创建时间。可以找到表文件,但是在Linux上你无法获得文件创建时间。所以我认为答案是你只能在Windows上找到这些信息,使用以下步骤:

  • 使用select datname, datdba from pg_database;
  • 获取数据库ID
  • 使用select relname, relfilenode from pg_class;
  • 获取表格filenode ID
  • 找到表格文件并查找其创建时间;我认为该位置应该类似于<PostgreSQL folder>/main/base/<database id>/<table filenode id>(不确定它在Windows上是什么)。

答案 2 :(得分:2)

我不认为它可能来自PostgreSQL,但您可能会在基础表文件的创建时间内找到它。

答案 3 :(得分:0)

我正在尝试采用另一种方式来获取此信息。 从service instance开始,我的解决方法是:

DROP TABLE IF EXISTS t_create_history CASCADE;
CREATE TABLE t_create_history (
    gid serial primary key,
    object_type varchar(20),
    schema_name varchar(50),
    object_identity varchar(200),
    creation_date timestamp without time zone 
    );



--delete event trigger before dropping function
DROP EVENT TRIGGER IF EXISTS t_create_history_trigger;

--create history function
DROP FUNCTION IF EXISTS public.t_create_history_func();

CREATE OR REPLACE FUNCTION t_create_history_func()
RETURNS event_trigger
LANGUAGE plpgsql
AS $$
DECLARE
    obj record;
BEGIN
    FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands  () WHERE command_tag in ('SELECT INTO','CREATE TABLE','CREATE TABLE AS')
    LOOP
        INSERT INTO public.t_create_history (object_type, schema_name, object_identity, creation_date) SELECT obj.object_type, obj.schema_name, obj.object_identity, now();
    END LOOP; 

END;
$$;


--ALTER EVENT TRIGGER t_create_history_trigger DISABLE;
--DROP EVENT TRIGGER t_create_history_trigger;

CREATE EVENT TRIGGER t_create_history_trigger ON ddl_command_end
WHEN TAG IN ('SELECT INTO','CREATE TABLE','CREATE TABLE AS')
EXECUTE PROCEDURE t_create_history_func();

通过这种方式,您可以获得一个记录所有创建表的表。

答案 4 :(得分:0)

我尝试了另一种方法来获取表创建日期。假设您的数据库中有一个表清单,您可以在其中保存表的创建日期。然后,您可以运行以下命令来获取现有表创建日期:

    SELECT pg_tables.tablename, inventory.created_at
      FROM pg_tables
INNER JOIN inventory
        ON pg_tables.tablename = inventory.tablename

在我的用例中可以,因为我使用一组需要跟踪的动态表。

答案 5 :(得分:0)

  1. 检查数据目录位置 显示数据目录;
  2. 检查 Postgres 关系文件路径: 选择 pg_relation_filepath('table_name'); 你会得到你关系的文件路径
  3. 检查此文件的创建时间 <data-dir>/<relation-file-path>

答案 6 :(得分:-3)

您可以从pg_stat_last_operation获取此信息。以下是如何做到这一点:

select * from pg_stat_last_operation where objid = 'table_name'::regclass order by statime;

此表存储以下操作:

select distinct staactionname from pg_stat_last_operation;

 staactionname 
---------------
 ALTER

 ANALYZE

 CREATE

 PARTITION

 PRIVILEGE

 VACUUM
(6 rows)

答案 7 :(得分:-3)

- 查询

select pslo.stasubtype, pc.relname, pslo.statime
from pg_stat_last_operation pslo
join pg_class pc on(pc.relfilenode = pslo.objid)
and pslo.staactionname = 'CREATE'
Order By pslo.statime desc 

将有助于实现预期的结果

(在greenplum尝试过)