Sidenote/DISCLAIMER:
Detta är en dålig idé, eftersom tidpunkten för skapandet av tabeller inte är 100 % tillförlitlig, eftersom tabellen kan ha tappats internt och återskapats på grund av operationer på bordet, såsom CLUSTER.
Bortsett från det kan du få skapelsetiden så här (förutsatt att exempel-tabellnamn för t_benutzer
):
--select datname, datdba from pg_database;
--select relname, relfilenode from pg_class where relname ilike 't_benutzer';
-- (select relfilenode::text from pg_class where relname ilike 't_benutzer')
SELECT
pg_ls_dir
,
(
SELECT creation
FROM pg_stat_file('./base/'
||
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
)
|| '/' || pg_ls_dir
)
) as createtime
FROM pg_ls_dir(
'./base/' ||
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
)
)
WHERE pg_ls_dir = (SELECT relfilenode::text FROM pg_class WHERE relname ILIKE 't_benutzer')
Hemligheten är att använda pg_stat_file på respektive tabellfil.
-- http://www.greenplumdba.com/greenplum-dba-faq/howtofindtablecreationdateingreenplum
select
pg_ls_dir
,
(
select
--size
--access
--modification
--change
creation
--isdir
from pg_stat_file(pg_ls_dir)
) as createtime
from pg_ls_dir('.');
Enligt kommentaren i det här inlägget PostgreSQL:tid för tabellskapande detta är inte 100 % tillförlitligt, eftersom tabellen kan ha tappats internt och återskapats på grund av operationer på bordet, till exempel CLUSTER.
Även mönstret
/main/base/<database id>/<table filenode id>
verkar vara fel, som på min maskin har alla tabeller från olika databaser samma databas-id, och det verkar som om mappen har ersatts med något godtyckligt inodnummer, så du måste hitta den mapp vars nummer är närmast din tabells inode-id (max mappnamn där mapp-id <=table_inode_id och mappnamn är numeriskt)
Förenklad version ser ut så här:
SELECT creation
FROM pg_stat_file(
'./base/'
||
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
)
|| '/' || (SELECT relfilenode::text FROM pg_class WHERE relname ILIKE 't_benutzer')
)
Sedan kan du använda information_schema och cte för att göra frågan enkel, eller skapa din egen vy:
;WITH CTE AS
(
SELECT
table_name
,
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE table_name)
) as folder
,(SELECT relfilenode FROM pg_class WHERE relname ILIKE table_name) filenode
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema = 'public'
)
SELECT
table_name
,(
SELECT creation
FROM pg_stat_file(
'./base/' || folder || '/' || filenode
)
) as creation_time
FROM CTE
(alla tabeller skapade med nhibernate-schema skapar, så ungefär samma tid på alla tabeller på skärmdumpen är korrekt).
För risker och biverkningar, använd din hjärna och/eller fråga din läkare eller apotekspersonal;)