从PostgreSQL中的所有对象中删除COMMENT ON

时间:2013-06-21 14:27:52

标签: postgresql ddl

pg_dump without comments on objects?一样,是否有人知道快速删除所有对象上的注释(使用COMMENT ON创建)的命令?

现在,我使用bash生成一个SQL脚本,该脚本会逐个删除每个表/视图/列上的注释,但速度很慢,特别是对于> 4000列。 例如:

COMMENT ON COLUMN table1.column1 IS NULL;
COMMENT ON COLUMN table1.column2 IS NULL;
COMMENT ON COLUMN table1.column3 IS NULL;
...

3 个答案:

答案 0 :(得分:3)

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

DELETE FROM pg_description WHERE description = 'something special';

声明:
直接操作目录表是危险,是最后的手段。您必须知道自己在做什么并且您自己承担风险!如果你搞砸了,你可能搞砸了你的数据库(集群)。

我在pgsql-admin列表中询问了这个想法并获得了encouraging answer from Tom Lane

> DELETE FROM pg_description WHERE description = 'My very special
> totally useless comment.';

> AFAICS, there are no side-effects. Are there any?

It's safe enough, as long as you don't delete the wrong comments.
There's no hidden infrastructure for a comment.

            regards, tom lane

你应该确保没有任何你想要保留的评论。 首先检查您要删除的内容。请注意,许多内置的Postgres对象也有注释。

例如,要仅删除表格列上的所有评论,您可以使用:

SELECT *
-- DELETE
FROM   pg_description
WHERE  objsubid > 0;

The manual informs about the column objsubid:

  

对于表列的注释,这是列号(objoid和   classoid参考表格本身)。对于所有其他对象类型,此列为零。

答案 1 :(得分:2)

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

要删除特定对象(此处为mytable)的给定列位置的注释,您可以:

DELETE FROM pg_description WHERE (SELECT relname FROM pg_class WHERE oid=objoid)='mytable' AND objsubid=2;

...但请注意,它不比使用COMATE ON mytable.myfield IS 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_';

其中:

  • (SELECT relkind FROM pg_class WHERE oid = objoid)='v':所有观点
  • (SELECT relname FROM pg_class WHERE oid = objoid)~'v _':额外的安全性,我的观点名称都以'v _'开头

答案 2 :(得分:0)

如果你想在不破解系统表的情况下这样做,那么这将为你生成语句:

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子句,将其约束到您的模式。