Amazon Redshift 中的行为更改
随着 Amazon Redshift 不断发展和改进,为了增强性能、提高安全性和改善用户体验,我们引入了一些行为更改。此页面包含全面的资源,让您可以随时了解这些关键更新,采取必要措施,并避免对工作负载造成中断。
最近完成的行为更改
- 生效日期:2024 年 10 月 14 日
-
在 SQL 命令中不再将“nolock”替换为空字符串
以前,Amazon Redshift 在 SQL 命令中将“nolock”字符串替换为空字符串。从 Amazon Redshift 补丁 184 开始,Amazon Redshift 不再将“nolock”字符串替换为空字符串。由于进行了此项更改,工作负载中的某些查询可能会受到影响。如果您在对象标识符中使用“nolock”字符串,则查询可能会失败,并出现“找不到表/列”错误。如果您在 WHERE 子句或 INSERT/UPDATE/MERGE 子句中使用“nolock”字符串,则可能会在表数据中看到不同的输出或结果。此更改适用于 Amazon Redshift 预置数据仓库和 Redshift Serverless 数据仓库。
要确定工作负载中受到此更改影响的查询,请运行以下 SQL 命令。我们建议使用超级用户来运行查询,因为超级用户可以在 SYS_QUERY_TEXT 系统视图中访问所有行。如果查询返回查询 ID 列表,则可能需要对这些查询采取纠正措施。
select distinct query_id from sys_query_text where text ilike '%no' || 'lock%' and user_id > 1;
如果您的工作负载受到影响,可以采取以下纠正措施。
如果您使用“nolock”字符串作为 Microsoft SQL Server(MSSQL)提示,并且出现了语法错误,请从查询文本中删除“nolock”或“with (nolock)”,然后重新运行。
如果您使用“nolock”字符串作为标识符,并且出现“找不到表/列”错误,且删除“nolock”字符串是可以接受的,请在查询中删除该字符串。否则,请使用 ALTER 命令重命名对象以匹配查询。
如果您在 WHERE 子句中使用“nolock”字符串作为字符串文本,请确认是否正确应用了筛选条件。
如果您通过 INSERT/UPDATE/MERGE SQL 命令提取数据时使用了“nolock”字符串,则以前的“nolock”会替换为空字符串。现在,在 SQL 命令中不会替换“nolock”文本。确认您想要实现这种行为,或者从 SQL 中删除“nolock”。对于表中的现有数据,可能需要使用 UPDATE SQL 命令重新加载或更新数据。
要更新受影响的行级别安全性(RLS)策略或动态数据掩蔽(DDM)策略,请删除策略并重新创建,同时在策略定义中的受影响位置添加“nolock”字符串。