我们有几个列的命名模式(比如created/creation_date/create_date) / id/key,并希望统一它)。
我们也想用向后兼容的方式来做。我们希望能够与新代码一起运行旧代码,直到我们摆脱旧代码为止,如下所示:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;是一种彻底的改变。
表的视图(用于Postgresql)等列是否存在某种形式的混叠?
回答@CL (tnx表示提示!) https://www.postgresql.org/docs/12/ddl-generated-columns.html
生成的列不能直接写入。在INSERT或UPDATE命令中,不能为生成的列指定值,但可以指定关键字默认值。
因此,如果一个想法是保留列,直到您更新所有的报告脚本-这是好的。但是如果你想回回以前的应用程序版本--你运气不好(
目前我们正在Google上提供:https://cloud.google.com/sql/docs/postgres/db-versions和v12只在测试版。
发布于 2020-05-18 11:55:13
要做到这一点没有简单的方法,但我能想到的唯一方法是使用一层视图来保留旧名称。
创建两个模式,例如“旧”和“新”或类似的东西。
“新”模式包含具有新列(可能还有表)名称的真实表。拥有能够处理该问题的应用程序,将搜索_路径设置为仅新模式。
对于每个已重命名列的表(或者如果表本身被重命名),在“旧”模式中创建一个带有旧名称的视图。
create view old.table_name
as
select new_column_name as column_name,
some_other_column
from table_name;此视图将自动更新,无需为其编写触发器。
创建只能处理旧名称的应用程序,将其search_path设置为old, new。然后,对table_name的非限定引用将使用视图old.table_name和代码所期望的列。由于视图是可更新的,这将同样适用于DML。
显然,如果应用程序代码出于某种原因检查真实表的存在,这将无法工作。或尝试检测这些表的约束。
它还要求您可以在连接到数据库时更改搜索路径(例如,在使用JDBC时,可以通过在连接URL中传递它来实现这一点)。
https://dba.stackexchange.com/questions/267332
复制相似问题