最近在整理postgresql数据库的表、列的备注信息时,用到了如下的sql
表、视图、分区表的备注
with tmp_tab as (
select pc.oid as ooid,pn.nspname,pc.*
from pg_class pc
left outer join pg_namespace pn
on pc.relnamespace = pn.oid
where 1=1
and pc.relkind in ('r','v','m','f','p')
and pn.nspname not in ('pg_catalog','information_schema') -- select pn.oid, pn.* from pg_namespace pn where 1=1
and pn.nspname not like 'pg_toast%'
/*and pc.oid not in (
select inhrelid
from pg_inherits
)*/
order by pc.relname
),tmp_desc as (
select pd.*
from pg_description pd
where 1=1
and pd.objsubid = 0 --objsubid 对于一个表列上的一个注释,这里是列号(objoid和classoid指表本身)。对所有其他对象类型,此列为0。
--and pd.objoid=168605
)
select t0.*,
case when t0.relkind in ('r','p')
then 'comment on table '||t0.nspname||'.'||t0.relname||' is '''||coalesce(t0.description,'')||''';'
when t0.relkind='v'
then 'comment on view '||t0.nspname||'.'||t0.relname||' is '''||coalesce(t0.description,'')||''';'
end as table_description
from (
select tab.nspname,
tab.relname,
tab.relkind,
de.description
from tmp_tab tab
left outer join tmp_desc de
on tab.ooid = de.objoid
where 1=1
) t0
where 1=1
--and t0.description is not null
order by t0.nspname,t0.relname
;
列的备注
with tmp_tab as (
select pc.oid as ooid,pn.nspname,pc.*
from pg_class pc
left outer join pg_namespace pn
on pc.relnamespace = pn.oid
where 1=1
and pc.relkind in ('r','v','m','f','p')
and pn.nspname not in ('pg_catalog','information_schema') -- select pn.oid, pn.* from pg_namespace pn where 1=1
and pn.nspname not like 'pg_toast%'
/*
and pc.oid not in (
select inhrelid
from pg_inherits
)*/
order by pc.relname
),tmp_col as (
select pa.*
from pg_attribute pa
where 1=1
--and pa.attrelid = 168605
and pa.attisdropped = false
and pa.attname not in (
'tableoid',
'cmax',
'xmax',
'cmin',
'xmin',
'ctid'
)
),tmp_desc as (
select pd.*
from pg_description pd
where 1=1
and pd.objsubid <> 0 --objsubid 对于一个表列上的一个注释,这里是列号(objoid和classoid指表本身)。对所有其他对象类型,此列为0。
--and pd.objoid=168605
)
select t0.*,
'comment on COLUMN '||t0.nspname||'.'||t0.relname||'.'||t0.attname||' is '''||coalesce(t0.description,'')||''';' as column_description
from (
select tab.nspname,
tab.relname,
tc.attname,
tc.attnum,
de.description
from tmp_tab tab
left outer join tmp_col tc
on tab.ooid = tc.attrelid
left outer join tmp_desc de
on tc.attrelid = de.objoid and tc.attnum = de.objsubid
) t0
where 1=1
--and t0.description is not null
order by t0.nspname,t0.relname, t0.attnum
;
参考:
http://postgres.cn/docs/9.6/catalog-pg-class.html
http://postgres.cn/docs/9.6/catalog-pg-attribute.html
http://postgres.cn/docs/9.6/catalog-pg-description.html