8

我有类型的列columncharacter varying(20)我想将其增加到50

ALTER TABLE table ALTER COLUMN column TYPE character varying(50);

我得到一个错误view view_name depends on column "column"。我想知道如何在不删除和重新创建大约 10 个依赖视图的情况下更改列?

4

2 回答 2

13

您的问题的答案可以在这个博客上找到

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);

并且丢弃的对象将被重新创建。

这些函数关注:

  • 依赖层次
  • 跨层次结构删除和创建视图/物化视图的正确顺序
  • 恢复对视图/物化视图的评论和授权

单击此处 获取有效的 sqlfiddle 示例或查看此要点以获取完整的源代码

于 2014-07-17T07:04:20.307 回答
2

这是不可能的,而是一个TODO 功能。您应该创建一个能够处理诸如简单视图创建之类的脚本。

于 2013-08-01T09:27:02.910 回答