在Postgres

时间:2019-05-28 18:34:31

标签: postgresql

作为一个正在进行的项目,我的任务是评论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

我想使用此脚本来创建报告,在其中钻取表单并在数据库对象上注释所需的注释。

1 个答案:

答案 0 :(得分:1)

information_schemaANSI 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

如果您有任何遗漏,请告诉我(与其他重要事项相比,请进行比我更彻底的测试:))。