在 Salesforce 中创建 formula field, validation rule, workflow rule, approval process 都是比较常见的,而跨对象引用也经常会在其中用到。但是随着项目的扩大,对象间的关联关系越来越多,跨对象关系的引用也将受到限制。
每个对象上默认最多只能有 10 个跨对象的引用关系。当你在某个对象上创建 formula(in a formula field, field update or validation rule) 引用的时候,恰好该对象上的引用关系已经达到了 10 个,你就会收到一个类似这样的错误信息:
“You have reached the maximum number of 10 object references on [Object name] You must remove at least 1 relationship(s) in order to save this [Workflow Rule/formula field/..].”
10 个跨对象引用关系的限制实际是一种警告信息,当达到这个限制的时候就意味着在该对象上的引用逻辑已经太复杂、太庞大了。
什么是跨对象引用关系?
对象之间可以通过创建关系字段(Lookup/Master-Detail)关联起来。当对象之间互相关联以后,就可以通过创建 formula 引用来获取其他对象上的字段。
比如,现在有两个对象 Object1 和 Object2,在 Object1 上有一个 Lookup 到 Object2 的字段,我们可以在 Object1 上创建一个 formula 字段来存 Object2 上的字段信息,比如存 Object2 的 Owner,这样的 formula 字段就是使用跨对象引用关系的一种典型例子。
值得注意的是,自我引用的 lookup 关系也被当作一种跨对象引用关系,比如,Contact 上有一个 lookup 到它自己的字段,通过这个 lookup 关系创建的 formula 字段也会算作一个跨对象引用关系。
哪些地方会用到跨对象引用关系
- formula fields
- validation rules
- workflow rules and field update actions
- approval processes
- assignment rules
- escalation rules
- auto-response rules
怎样区分引用关系与非引用关系,怎样计算引用关系的个数
假如我们在 Case 上创建 formula 字段的时候,用到了下面某一种情况的引用:
- AccountId -- 0 relationship;
- Account.Id -- 1 relationship;
- Account.Owner.LastName -- 2 relationships (这两个关系分别是 Case - Account 和 Account - Owner)
- Parent.CaseNumber -- 1 relationship (Case-Case)
- CreatedBy.Profile.LastModifiedBy.Profile.Name -- 4 relationships (User-Profile-User-Profile)
- $User.ProfileId -- 0 relationship (引用全局变量不算在 Case 对象的引用关系中)
比如,在下面的 formula 定义中用到了 3 个引用关系,分别是 LastModifiedBy
, CreatedBy
和 CreatedBy.Profile
, 虽然CreatedBy
和 LastModifiedBy
分别出现了两次,但都只记做了一次引用,说明这里跟引用次数无关。
LastModifiedBy.LastName + LastModifiedBy.FirstName + CreatedBy.Profile.Name + CreatedBy.CompanyName
什么情况下会达到此限制
类似以下情况都会达到此限制:
- 在某个对象上有 10 个 formula 字段,并且每个字段都分别引用了不同的对象。
- 在某个对象上有 5 个 formula 字段,并且每个字段都分别引用了不同的对象;同时在这个对象上创建了 5 个分别引用了另外 5 个不同对象的 workflow field update。
- 在某个对象上有一个 formula 字段,一个 validation rule,一个 workflow rule,一个 approval process 和一个 assignment rule,它们分别引用了 2 个不同的对象。
减少跨对象引用关系的方法
- 创建 formula 字段是不是必要的?
创建 formula 字段的时候要谨慎,如果只是想在数据的 detail 页面显示这个字段,不需要在 report 里用,就可以建议用户通过 hover 相应的 lookup 字段来查看相关信息。 - 某个跨对象引用只在 validation rule 中用到了?
比如 Object2__r.Name 只出现在了 validation rule 里面,没有在其他地方(workflow rule/formula field)用到,这种情况就可以用trigger来代替 validation rule。 - 某个跨对象引用只在 workflow rule 中用到了?
类似于第二种情况,可以用 trigger 来代替 workflow rule.
增加每个对象上跨对象引用关系的限制数量
系统管理员可以通过 Salesforce Support 功能在 Help&Training 页面提交一个 Case 把此限制从 10 个增加到 15 个.