更改列忽略依赖视图

mes*_*age 7 postgresql

我有柱columncharacter varying(20)型,我想将它提高到50

ALTER TABLE table ALTER COLUMN column TYPE character varying(50);
Run Code Online (Sandbox Code Playgroud)

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

Ruu*_*uut 10

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

在修改现有对象时,PostgreSQL非常严格.通常,当您尝试ALTER TABLE或REPLACE VIEW时,它会告诉您无法执行此操作,因为还有另一个对象(通常是视图或物化视图),这取决于您要修改的对象.似乎唯一的解决方案是DROP依赖对象,对目标对象进行所需的更改,然后重新创建丢弃的对象.

这是繁琐和繁琐的,因为那些依赖对象可以具有进一步的依赖性,其也可以具有其他依赖性等等.我创建了实用功能,可以在这种情况下提供帮助.

用法非常简单 - 你只需要打电话:

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示例或查看此要点以获取完整的源代码