𝗬𝗼𝘂𝗿 𝗔𝗽𝗲𝘅 𝗠𝗶𝗴𝗵𝘁 𝗥𝗲𝘁𝘂𝗿𝗻 𝗙𝗲𝘄𝗲𝗿 𝗥𝗲𝗰𝗼𝗿𝗱𝘀 𝗶𝗻 𝗦𝘂𝗺𝗺𝗲𝗿 '𝟮𝟲
Salesforce Summer '26 (API v67.0) 为 Apex 带来了重大变化。这一变化可能会改变您的代码结果,而不会抛出任何错误。
多年来,Apex 默认以系统模式 (system mode) 运行。这意味着 SOQL、SOSL 和 DML 会忽略用户权限和共享规则。您的代码可能会向不应看到数据的用户展示数据。
在 API v67.0 中,默认设置发生了反转。数据库操作现在以用户模式 (user mode) 运行。
v67.0 中的变化:
• SOQL、SOSL 和 DML 默认强制执行用户权限和共享规则。 • 没有声明共享方式 (sharing declaration) 的类现在默认使用 "with sharing"。 • "WITH SECURITY_ENFORCED" 已被移除。您必须改用 "WITH USER_MODE"。 • 触发器 (Triggers) 始终以系统模式运行。
此变化与您类的 API 版本相关联。在您将其升级到 67.0 之前,旧类将保持不变。这让您可以控制迁移过程。
警惕这些隐蔽问题:
- 查询返回的记录减少:由于用户缺乏访问权限,查询可能会返回 40 行记录而不是 500 行。这会导致总计错误和报表异常。
- 编译错误:"WITH SECURITY_ENFORCED" 在新版本中将无法通过编译。
- 集成失败:集成用户可能会失去自动化作业所需的访问数据权限。
- 共享规则变更:依赖于“无共享声明”的类现在将强制执行共享规则。
如何安全迁移:
- 盘点代码:搜索 "WITH SECURITY_ENFORCED" 以及没有共享声明的类。
- 在沙盒 (sandbox) 中测试:首先更新高风险类,例如控制器 (controllers) 和 REST 端点 (REST endpoints)。
- 使用
System.runAs():不要仅仅依赖通过的测试。请使用受限用户进行测试,以检查数据可见性。 - 有目的地使用:仅在有特定理由时才使用 "SYSTEM_MODE" 或 "without sharing"。
现在进行这些更改可以防止日后出现隐蔽的生产环境 Bug。
Optional learning community: https://t.me/GyaanSetuAi