删除PostgreSQL中所有对象的注释

删除PostgreSQL中所有对象的注释,postgresql,ddl,Postgresql,Ddl,与之相同的是,是否有人知道一个命令,可以一次快速删除在所有对象上使用COMMENT创建的注释 现在,我求助于bash生成一个SQL脚本,该脚本将逐个作废每个表/视图/列上的注释,但速度相当慢,尤其是当列数>4000时。 例如: 不久前,我遇到了一个非常类似的问题,并提出了一个非常简单的解决方案:直接从系统目录表中删除。注释只是附加到对象上,否则不会产生干扰 DELETE FROM pg_description WHERE description = 'something special'; 免

与之相同的是,是否有人知道一个命令,可以一次快速删除在所有对象上使用COMMENT创建的注释

现在,我求助于bash生成一个SQL脚本,该脚本将逐个作废每个表/视图/列上的注释,但速度相当慢,尤其是当列数>4000时。 例如:


不久前,我遇到了一个非常类似的问题,并提出了一个非常简单的解决方案:直接从系统目录表中删除。注释只是附加到对象上,否则不会产生干扰

DELETE FROM pg_description WHERE description = 'something special';
免责声明: 直接操作目录表是危险的,也是最后的手段。你必须知道你在做什么,并且你自己承担风险!如果你搞砸了,你可能会搞砸你的数据库集群

我在pgsql管理列表中询问了这个想法,得到了一个:

>从pg_description中删除,其中description='我的非常特别 >毫无用处的评论。”; >AFAICS,没有副作用。有吗? 只要你不删除错误的评论,就足够安全了。 没有隐藏的基础设施可供评论。 你好,汤姆·莱恩 你应该确保没有任何你想保留的评论。 首先检查要删除的内容。请注意,许多内置Postgres对象也有注释

例如,要仅删除表列上的所有注释,可以使用:

SELECT *
-- DELETE
FROM   pg_description
WHERE  objsubid > 0;
对于表列上的注释,这是objoid和 classoid指的是表本身。对于所有其他对象类型,此列为零


好的,感谢您的帮助,我发现以下命令非常有用:

要从特定对象mytable的给定列位置删除注释,可以执行以下操作:

DELETE FROM pg_description WHERE (SELECT relname FROM pg_class WHERE oid=objoid)='mytable' AND objsubid=2;
…但请注意,它并不比在mytable上使用注释更有效。myfield为NULL

现在,要从我的用户定义视图和基础列中删除所有注释,下面是非常有效的方法:

DELETE FROM pg_description WHERE (SELECT relkind FROM pg_class WHERE oid=objoid)='v' AND (SELECT relname FROM pg_class WHERE oid=objoid) ~ 'v_';
其中:

从pg_类中选择relkind,其中oid=objoid='v':所有视图 从pg_类中选择relname,其中oid=objoid~'v_uu':额外的安全性,我的视图的名称都以'v_u'开头
如果您希望在不破坏系统表的情况下执行此操作,那么这将为您生成以下语句:

SELECT 'COMMENT ON COLUMN ' || quote_ident(pg_namespace.nspname) || '.' || quote_ident(pg_class.relname) || '.' || quote_ident(columns.column_name) || ' IS NULL;'
FROM   pg_description
JOIN pg_class ON pg_class.oid = pg_description.objoid
JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
JOIN information_schema.columns 
  ON columns.table_schema = pg_namespace.nspname
 AND columns.table_name = pg_class.relname
 AND columns.ordinal_position = pg_description.objsubid

您可能应该添加一个WHERE子句,将其约束到模式中。

尝试编写一个PL/SQL函数,该函数查询pg_描述并使用动态SQL删除元素。它将比任何bash脚本都快得多。
SELECT 'COMMENT ON COLUMN ' || quote_ident(pg_namespace.nspname) || '.' || quote_ident(pg_class.relname) || '.' || quote_ident(columns.column_name) || ' IS NULL;'
FROM   pg_description
JOIN pg_class ON pg_class.oid = pg_description.objoid
JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
JOIN information_schema.columns 
  ON columns.table_schema = pg_namespace.nspname
 AND columns.table_name = pg_class.relname
 AND columns.ordinal_position = pg_description.objsubid