与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;
...
答案 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_';
其中:
答案 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子句,将其约束到您的模式。