作为一个正在进行的项目,我的任务是评论postgres数据库中的所有内容,从而记录所有对象及其作用。是否有SELECT
脚本可以显示所有表,视图,列和函数等及其注释,包括带空注释的注释。以下是我所追求的示例:
SELECT object_type,object_schema,object_name,comment
FROM information_schema.some_table_out_there;
|object_type|object_schema|object_name|comment|
|table | my_schema |table1 |my first table
|table | my_schema |table2 |NULL
|view | public |employees |NULL
|function | public |emps_insert|inserts employees
我想使用此脚本来创建报告,在其中钻取表单并在数据库对象上注释所需的注释。
答案 0 :(得分:1)
information_schema
由ANSI standard定义,因此它仅涵盖SQL规范描述的对象。不包括索引,也不包含任何特定于Postgres的索引(事件触发器,行安全策略等)。如果您想获取详尽的列表,则需要转到system catalogs。
没有中央的对象列表;每个对象类型都位于其自己的表中,因此您需要分别查询每个对象。但是,有些方便的object information functions可以接受任何对象类型,因此我们可以使用一些动态SQL将这些查询轻松地粘合在一起:
create function describe_all_objects()
returns table(
type text,
schema text,
name text,
identity text,
comment text
)
as $$
declare
/* Cutoff for system object OIDs; see comments in src/include/access/transam.h */
MIN_USER_OID constant oid = 16384;
catalog_class regclass;
begin
for catalog_class in
/* Get a list of all catalog tables with an OID */
select oid::regclass
from pg_class
where
relhasoids and
pg_class.oid < MIN_USER_OID and
/* Enum members have no obj_description(); the enum itself is picked up in pg_type */
pg_class.oid <> 'pg_enum'::regclass
loop
return query execute format(
$SQL$
/* Get descriptions for all user-created catalog entries */
select
info.type,
info.schema,
info.name,
info.identity,
coalesce(
obj_description(catalog_table.oid, catalog_table.tableoid::regclass::text),
shobj_description(catalog_table.oid, catalog_table.tableoid::regclass::text)
) as comment
from
%s as catalog_table,
lateral pg_identify_object(catalog_table.tableoid, catalog_table.oid, 0) as info
where
catalog_table.oid >= %s
$SQL$,
catalog_class,
MIN_USER_OID
);
end loop;
/* Handle "sub-objects" (i.e. pg_attribute) separately */
return query
select
info.type,
info.schema,
info.name,
info.identity,
col_description(attrelid, attnum) as comment
from
pg_attribute,
lateral pg_identify_object('pg_class'::regclass, attrelid, attnum) as info
where
attrelid >= MIN_USER_OID and
attnum >= 0 and
not attisdropped;
end
$$
language plpgsql stable;
select * from describe_all_objects();
这应该覆盖数据库中的每个对象,一直到隐式表数组类型和TOAST表索引上的列,以及服务器范围的对象(例如数据库和用户),因此您可能会希望对此进行过滤。
少数目录表需要超级用户权限才能直接访问,但是,如果这是一个问题,则您应该能够修改查询以从某些公共源中提取信息(例如,pg_authid
仅限于超级用户,因为它包含密码信息,但您可以查看pg_roles
。
如果您有任何遗漏,请告诉我(与其他重要事项相比,请进行比我更彻底的测试:))。