Yan*_*hon 14 postgresql view postgresql-9.3
我有一个VIEW我正在尝试为其创建进化脚本的地方,因此我可以向其中添加一列。那部分工作正常;列添加就好了。但是,反过来不起作用;删除最后添加的列失败并显示一条ERROR: cannot drop columns from view消息。问题是这个特定的视图有很多引用,从和到,因此我不能只是DROP CASCADE该死的东西!
是否有原因我无法从给定中删除新添加的列VIEW?那么,我该怎么做才能完成这个任务呢?
(注意:这里的情况就是它们的样子,但我可以很好地看到类似的情况,也就是在许多其他情况下从视图中删除列。)
Cra*_*ger 18
PostgreSQL(至少为 9.4)目前不支持删除带有CREATE OR REPLACE VIEW.
新查询必须生成与现有视图查询生成的列相同的列(即,相同的列名以相同的顺序和相同的数据类型),但它可能会在列表的末尾添加额外的列。
无法添加对删除列的支持没有根本原因,但还没有人完成实现它所需的工作。
CREATE OR REPLACE VIEW必须递归扫描所有依赖项并确保它们都没有引用要删除的列。如果他们使用SELECT *它,则必须从*依赖项中的扩展中删除该列,然后也扫描其依赖项。这样做需要做很多工作,并且在某些方面尚不清楚删除列应该如何准确表现,尤其是在与转储和重新加载的交互方面。所以没有人想要足够的功能来实现它。欢迎开发补丁和/或赞助。
您将不得不删除视图及其依赖的所有内容,然后重新创建它及其依赖项。(曾经是真同样添加到视图中的列;用于添加列在支持8.4引入)。
请注意,通常不期望 DDL 是可逆的。“权力下放”的概念确实有缺陷。例如,如果您删除一列,然后再次添加它,数据仍然没有。