课程章节介绍
同学们,咱们今天来聊聊Apex中的共享规则,也就是控制代码是否遵守组织和记录共享权限的关键字。你可能会在类定义上看到`with sharing`、`without sharing`或者`inherited sharing`这些声明。它们的作用是什么呢?简单说,就是告诉Salesforce执行这段代码时,要不要参考当前用户的访问权限和共享规则。
我们先看最直接的:`with sharing`。如果你在类上写了`with sharing`,那么这个类里所有的数据库操作和SOQL查询都会严格遵循当前用户的权限,比如对象级别、字段级别和记录共享规则。这能保证数据安全,防止越权访问。
反过来,如果不想要这些限制,比如你要做一些管理员级别的批量处理,就可以用`without sharing`,让代码在系统模式下运行,忽略当前用户的共享规则。
还有一个比较灵活的选项叫`inherited sharing`。这个关键字是让类本身不固定共享模式,而是由调用它的那一方来决定。如果调用的地方是`with sharing`上下文,那这个类就以共享模式运行;如果调用方是`without sharing`,那它也跟着不共享。这就给了你更多的运行时弹性。
从API 67.0版开始,Salesforce做了一个重要的默认行为调整:一个类如果没有明确写任何共享声明,它会默认按照`with sharing`执行。而在旧版本里,这种省略的情况下是默认`without sharing`的。所以,为了让你的代码行为清晰、不因版本迁移出现意外,官方现在的强烈建议是:只要你的类涉及数据库操作或SOQL查询,就一定要显式地加上共享声明,不管是`with sharing`、`without sharing`还是`inherited sharing`,明确写出来,对自己、对其他阅读代码的人都有好处。
再补充一点关于触发器的特殊情况。触发器默认是不共享的,它们本身运行在系统上下文,没有共享限制。但是请注意,在触发器内部执行的数据库操作,现在的默认行为是运行在用户模式下,也就是会尊重当前用户的字段权限和共享规则。这个细节很容易搞混,所以处理触发器的逻辑时,也要多留意权限控制的期望。
总结一下,记住这条原则:永远别让你的类共享声明空着,根据实际场景选一个,清楚表达你的意图,这样代码才能安全又可靠。咱们写代码,先讲清楚规矩,后续维护就少踩坑。
关键词
Apex
Salesforce
Developer Guide