我的列column
有character varying(20)
类型,我希望将其增加到50
ALTER TABLE table ALTER COLUMN column TYPE character varying(50);
我收到view view_name depends on column "column"
的错误。我想知道如何在不丢弃并重新创建大约10个依赖视图的情况下更改列?
答案 0 :(得分:10)
您可以在blog
上找到问题的答案PostgreSQL在修改现有内容时非常严格 对象。经常在尝试ALTER TABLE或REPLACE VIEW时 告诉你,你不能这样做,因为还有另一个对象 (通常是视图或物化视图),这取决于你 想修改。似乎唯一的解决方案是DROP依赖 对象,对目标对象进行所需的更改,然后重新创建 丢弃的物体。
这是繁琐而繁琐的,因为那些依赖对象可以拥有 进一步的依赖,也可能有其他依赖等等 上。我创建了utility functions,可以在这种情况下提供帮助。
使用非常简单 - 您只需致电:
select deps_save_and_drop_dependencies(p_schema_name, p_object_name);
您 必须传递两个参数:模式的名称和名称 该架构中的对象。该对象可以是表,视图或 物化观点。该函数将删除所有视图并实现 视图依赖于
p_schema_name.p_object_name
并保存DDL 在辅助表中恢复它们。当你想要恢复那些被丢弃的对象时(例如当你 完成modyfing
p_schema_name.p_object_name
),你只需要做 另一个简单的电话:
select deps_restore_dependencies(p_schema_name,p_object_name);
将重新创建已删除的对象。
这些功能需要注意:
- 依赖关系层次结构
- 在层次结构中删除和创建视图/物化视图的正确顺序
- 恢复对观看次数/具体化观点的评论和授权
答案 1 :(得分:2)
这是不可能的,但是TODO feature。您应该创建一个能够处理简单视图创建之类的脚本。