Note a margine/DISCLAIMER:
Questa è una cattiva idea, poiché il momento di creazione della tabella non è affidabile al 100%, perché la tabella potrebbe essere stata eliminata internamente e ricreata a causa di operazioni sulla tabella, come CLUSTER.
A parte questo, puoi ottenere il tempo di creazione in questo modo (assumendo nome-tabella di esempio di 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')
Il segreto è usare pg_stat_file sul rispettivo file di tabella.
-- 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('.');
Come da commento in questo post PostgreSQL:tempo di creazione della tabella questo non è affidabile al 100%, perché la tabella potrebbe essere stata eliminata internamente e ricreata a causa di operazioni sulla tabella, come CLUSTER.
Anche il modello
/main/base/<database id>/<table filenode id>
sembra essere sbagliato, poiché sulla mia macchina, tutte le tabelle di database diversi hanno lo stesso ID database e sembra che la cartella sia stata sostituita con un numero di inode arbitrario, quindi è necessario trovare la cartella il cui numero è più vicino a quello della tabella inode id (nome cartella massimo dove id cartella <=table_inode_id e nome cartella è numerico)
La versione semplificata funziona così:
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')
)
Quindi puoi utilizzare information_schema e cte per semplificare la query o creare la tua vista:
;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
(tutte le tabelle create con lo schema nhibernate vengono create, quindi più o meno la stessa ora su tutte le tabelle nello screenshot è corretta).
Per rischi ed effetti collaterali, usa il cervello e/o chiedi al tuo medico o farmacista;)