我在我们的数据库中有一个非常中心的表,它被一系列应用程序使用,它附加了规则、触发器和所有你可以想象的依赖项。现在我想修改表而不会对依赖项造成任何问题。我以前成功地完成了以下操作,但在一个不太复杂的情况下:
alter table reconciliations rename to matches;
create view reconciliations as select * from matches;
这样做的目的是我现在可以修改新的“匹配”表,例如添加一列或多行,这些不需要在“对账”视图中显示(通过添加 where 子句将它们过滤掉)。
我在 Postgres 9.5 上,所以视图是自动更新的。初步测试表明这没有直接的问题,所以我问这个问题是为了知道我应该寻找什么样的问题。性能不是大问题。
如果您在生产中执行此操作,请注意准备好的语句。这些已经被解析、重写(并且查询计划被缓存)。效果会一直持续到准备好的语句被释放(这可能需要很长时间)。
检查准备好的语句(仅限同一会话!):
该效果还扩展到处理 SQL 命令(如内部准备好的语句)的 plpgsql 函数。
通常情况下,准备好的语句在涉及的对象发生任何更改后都会被强制重新计划。但是你的行为绕过了这个安全机制。
此外,大多数查询将继续工作。但不是所有的。
演示
这有效:
但这不是:
手册
PREPARE
:以上是另一个“语义等价不完美”的例子。