6

与没有对对象注释的 pg_dump一样吗?,有没有人知道一个命令可以立即删除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;
...
4

3 回答 3

6

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

DELETE FROM pg_description WHERE description = 'something special';

免责声明:
直接操作目录表是危险的,是不得已而为之的措施。您必须知道自己在做什么,并且您自己承担风险!如果你搞砸了,你可能会搞砸你的数据库(集群)。

我在 pgsql-admin list 上询问了这个想法,并从 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;

该手册介绍了该列objsubid

对于表列的注释,这是列号(objoidclassoid引用表本身)。对于所有其他对象类型,此列为零。

于 2013-06-21T16:30:35.360 回答
2

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

要从特定对象(此处为 mytable)的给定列位置删除评论,您可以执行以下操作:

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

...但请注意,它并不比在 mytable.myfield IS NULL 上使用 COMMENT 更有效;

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

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_' 开头
于 2013-06-21T20:23:53.433 回答
1

如果您想在不破解系统表的情况下执行此操作,那么这将为您生成语句:

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 子句,将其限制在您的模式中。

于 2017-11-15T15:54:44.140 回答