如何在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

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

尼克·巴恩斯

information_schema是由ANSI标准定义的,因此仅涵盖SQL规范描述的对象。不包括索引,也不包含任何特定于Postgres的索引(事件触发器,行安全策略等)。如果您需要详尽的列表,则需要转到系统目录

没有对象的集中列表;每个对象类型都位于其自己的表中,因此您需要分别查询每个对象。但是,有一些方便的对象信息函数可以接受任何对象类型,因此我们可以使用一些动态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)。

让我知道您是否发现任何遗漏(请在进行任何重要操作之前比我进行更彻底的测试:))。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在PostgresQL中显示所有无效对象

如何在C#中的嵌套json对象中探索所有属性及其值?

如何在PostgreSQL中列出所有数据库及其架构?

如何在PostgreSQL中列出表的所有索引及其相应大小?

如何在Javascript中显示对象数组的所有输入?

如何在WordPress中显示类别列表及其所有帖子?

如何在MongoDB中以升序/降序显示所有数据库及其大小

如何在VS2012中将所有类及其属性导出为文本而不加注释

如何在JavaScript中为Closure Compiler注释嵌套对象,并使所有属性可选?

如何在Swift 2中删除所有地图注释

如何显示js对象名称及其所有属性值?

如何在Django中显示不同时区中的所有日期时间对象

postgresql-如何在“ in”运算符中显示所有值?

如何在Redshift中列出所有表及其创建者(或所有者)

如何显示所有注释呼出Swift

如何在所有对象的数组中显示特定字段

如何在DRF的父序列化器中获取和显示所有子对象

如何在Lua表中查找Corona SDK显示对象的所有条目?

如何在Django中导出实例及其所有相关对象?

如何在特定发票上显示所有产品及其销售数量

Angular 2+:如何从HTML代码中删除所有角度属性和注释(以及其他角度工件)?

如何仅显示注释一次,但在PHP中显示来自mysql的所有图像?

如何通过SQL查询在表中显示所有列及其数据类型

如何在hadoop hdfs中列出目录及其子目录中的所有文件

如何在表中列出ActiveDirectory中的所有计算机及其OU?

如何从 div 中的 fetch 显示数组的所有对象?

Oracle对象:如何显示选择查询中的所有字段?

如何显示模板中的所有子对象?

如何在树枝中递归显示注释