我有类型的列column
,character varying(20)
我想将其增加到50
ALTER TABLE table ALTER COLUMN column TYPE character varying(50);
我得到一个错误view view_name depends on column "column"
。我想知道如何在不删除和重新创建大约 10 个依赖视图的情况下更改列?
我有类型的列column
,character varying(20)
我想将其增加到50
ALTER TABLE table ALTER COLUMN column TYPE character varying(50);
我得到一个错误view view_name depends on column "column"
。我想知道如何在不删除和重新创建大约 10 个依赖视图的情况下更改列?
您的问题的答案可以在这个博客上找到
PostgreSQL 在修改现有对象时非常严格。很多时候,当您尝试 ALTER TABLE 或 REPLACE VIEW 时,它会告诉您不能这样做,因为还有另一个对象(通常是视图或实体化视图),这取决于您要修改的对象。似乎唯一的解决方案是删除依赖对象,对目标对象进行所需的更改,然后重新创建删除的对象。
这是繁琐和繁琐的,因为那些依赖的对象可以有进一步的依赖,也可能有其他的依赖等等。我创建了可以在这种情况下提供帮助的实用函数。
用法很简单——你只需要调用:
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);
并且丢弃的对象将被重新创建。
这些函数关注:
- 依赖层次
- 跨层次结构删除和创建视图/物化视图的正确顺序
- 恢复对视图/物化视图的评论和授权
这是不可能的,而是一个TODO 功能。您应该创建一个能够处理诸如简单视图创建之类的脚本。