可以为一对多关系配置级联行为,以保持数据完整性并自动执行业务流程。 用于.NET的 Web API 和 SDK 都支持配置级联行为。
使用 Web API 配置级联行为
使用 Web API 时,可以使用 OneToManyRelationshipMetadata 实体类型定义一对多关系。 此定义包括要创建的相交表的名称,并说明如何通过使用 AssociatedMenuConfiguration 复杂类型、Label 复杂类型 和 LocalizedLabel 复杂类型 在应用程序中呈现关系。
有关详细信息,请参阅 使用 Web API 创建一对多关系。
使用 .NET SDK 配置级联行为
使用 CreateOneToManyRequest 或 UpdateRelationshipRequest 类时,请在请求正文中包含 OneToManyRelationshipMetadata 类 的实例。 在该 CascadeConfiguration 类的属性中,使用该 CascadeConfiguration 类。
CascadeConfiguration 类或 CascadeConfiguration 复杂类型包含表示可以在一对多关系中对引用表执行的操作的属性。 可以为每个属性分配 CascadeType 枚举类型的值之一。
| 值 | 应用程序标签 | 说明 |
|---|---|---|
| 活跃 | 可用项的级联 | 对所有与被引用的表记录关联的有效的引用表记录执行操作。 |
| 层叠 | 级联全部 | 对与被引用的表记录关联的所有关联表记录执行操作。 |
| NoCascade | 无级联 | 不执行任何操作。 |
| RemoveLink | 删除链接 | 移除所有关联表记录中指向目标表记录的引用列值。 |
| 限制 | 限制 | 当引用表存在时,防止删除引用的表记录。 |
| UserOwned | 用户负责项的级联 | 对由与被引用表记录相同用户拥有的所有引用表记录执行操作。 |
考虑进行级联操作的活动记录
对活动记录的级联动作仅包括状态代码为 Active 的记录。 对于级联作,这些表的以下状态代码被视为处于活动状态。 不同的标签(非 活动)可用于不同表中的此状态代码。 除下表中的值以外的任何自定义状态或状态代码不会作为活动记录进行处理,以用于级联目的。
| 表名 | 状态代码 0 | 状态代码 1 | 状态代码 2 | 状态代码 3 |
|---|---|---|---|---|
| 客户 | x | |||
| 批量操作 | x | |||
| 批量操作 | x | |||
| CampaignResponse | x | |||
| 联系人 | x | |||
| x | ||||
| 传真 | x | |||
| 事件 | x | |||
| 事件解决 | x | |||
| 发票 | x | |||
| 潜在顾客 | x | |||
| 信件 | x | |||
| 商机 | x | |||
| 商机关闭 | x | |||
| OrderClose | x | |||
| 通话 | x | |||
| SalesOrder | x | |||
| 任务 | x | |||
| 所有自定义表和自定义活动 | x | |||
| 报价 | x | |||
| 合同 | x | |||
| 预约 | x | |||
| ServiceAppointment | x | |||
| RecurringAppointmentMaster | x |
SDK for .NET CascadeConfiguration 类或 Web API CascadeConfiguration 复杂类型包含以下属性,表示可以在一对多关系中对引用表执行的操作。
| Action | 说明 | 有效选项 |
|---|---|---|
| 分配 | 更改引用的表记录所有者和/或业务部门。 | 活跃 层叠 NoCascade UserOwned |
| 删除 | 删除引用的表记录。 注意: 此操作的选项有限制。 | 层叠 RemoveLink 限制 |
| 合并 | 将记录与另一条记录合并。 注意: 对于可合并的引用表,Cascade 是唯一有效的选项。 在其他情况下,请使用 NoCascade。 | 层叠 NoCascade |
| 重定父级 | 稍后请参阅 “关于重新设置父级”。 | 活跃 层叠 NoCascade UserOwned |
| 共享 | 当引用的表记录与其他用户共享时。 | 活跃 层叠 NoCascade UserOwned |
| 取消共享 | 当引用的表记录共享被移除时。 | 活跃 层叠 NoCascade UserOwned |
注释
在以下情况下,不会执行分配、删除、合并和重新指定父级操作:
- 如果原始父记录和请求的操作包含相同的值。 示例:尝试触发“分配”操作,并选择一个已是该记录所有者的联系人
- 尝试对已经运行级联操作的父记录执行某个操作
注释
执行分配时,当重新分配发生时,记录上当前处于活动状态的任何工作流或业务规则将自动停用。 如果想要继续使用工作流或业务规则,则记录的新所有者将需要重新激活该规则。
关于分配操作
更新父记录时,分配操作会向所有子记录级联更新所有者、所属业务单元或两者。
未启用跨业务部门的记录所有权许可
如果未启用允许跨业务部门的记录所有权,则在更改记录所有者时,无法显式更新业务部门列的拥有权。 下表展示更新父记录所有者时的级联行为。
当你更新所有者时:
- 默认级联分配行为(级联全部)
- 将所有者的更新记录转移给新所有者
- 记录业务单元更新为新所有者的业务单元
- 子记录的所有者更改为新所有者
- 子记录的业务单元更新为新所有者的业务单元
- 级联分配设置为“无”
- 将所有者的更新记录转移给新所有者
- 记录业务单元更新为新所有者的业务单元
- 子记录的所有者不会更新(无级联)
- 子记录业务单元不更新(无级联)
已启用允许跨业务部门记录所有权的功能
启用 允许跨业务单元记录所有权 时,可以在更改记录的所有者时更新拥有业务单元的列。 以下列表显示更新父级记录所有者和业务单元时的级联行为。
在 environment 数据库设置中设置AlwaysMoveRecordToOwnerBusinessUnit,或使用 Microsoft Dynamics CRM 的 OrgDBOrgSettings 工具。
当你更新所有者时:
AlwaysMoveRecordToOwnerBusinessUnit = true (默认值)
- 默认级联分配行为(级联全部)
- 将所有者的更新记录转移给新所有者
- 记录业务单元更新为新所有者的业务单元
- 子记录的所有者更改为新所有者
- 子记录的业务单元更新为新所有者的业务单元
- 级联分配设置为“无”
- 将所有者的更新记录转移给新所有者
- 记录业务单元更新为新所有者的业务单元
- 子记录的所有者不会更新(无级联)
- 子记录业务单元不更新(无级联)
- 默认级联分配行为(级联全部)
如果您更新业务单元:
AlwaysMoveRecordToOwnerBusinessUnit = true (默认值)
- 默认级联分配行为(级联全部)
- 记录所有者不会更新
- 记录业务部门更新为新业务部门的过程
- 子记录所有者不更新
- 子记录业务单元更新为新业务单元
- 级联分配设置为“无”
- 记录所有者不会更新
- 记录业务部门更新为新业务部门的过程
- 子记录所有者不更新
- 子记录的业务单元未更新
- 默认级联分配行为(级联全部)
若同时更新所有者和业务单元:
AlwaysMoveRecordToOwnerBusinessUnit = true (默认值)
- 默认级联分配行为(级联全部)
- 将所有者的更新记录转移给新所有者
- 更新记录业务单元为新业务单元
- 子记录的所有者更改为新所有者
- 将子记录的业务单位更新为新的业务单位
- 级联分配设置为“无”
- 将所有者的更新记录转移给新所有者
- 更新记录业务单元为新业务单元
- 不更新子记录所有者
- 不要更新子记录的业务单位
- 默认级联分配行为(级联全部)
使用 OrgDBSettings AlwaysMoveRecordToOwnerBusinessUnit 更改级联行为
如果将 AlwaysMoveRecordToOwnerBusinessUnit 设置为 false,则用户拥有的记录的业务单元不会移动到新用户的业务部门。
在 environment 数据库设置中设置AlwaysMoveRecordToOwnerBusinessUnit,或使用 Microsoft Dynamics CRM 的 OrgDBOrgSettings 工具。
当你更新所有者时:
AlwaysMoveRecordToOwnerBusinessUnit = 假
- 默认级联分配行为(级联全部)
- 将所有者的更新记录转移给新所有者
- 不要更新记录的业务单元
- 子记录的所有者更改为新所有者
- 不要更新子记录的业务单位
- 级联分配设置为“无”
- 将所有者的更新记录转移给新所有者
- 不要更新记录的业务单元
- 不更新子记录所有者
- 不要更新子记录的业务单位
- 默认级联分配行为(级联全部)
如果您更新业务单元:
AlwaysMoveRecordToOwnerBusinessUnit = 假
- 默认级联分配行为(级联全部)
- 记录所有者不会更新
- 记录业务部门更新为新业务部门的过程
- 子记录所有者不更新
- 子记录业务单元更新为新业务单元
- 级联分配设置为“无”
- 记录所有者不会更新
- 记录业务部门更新为新业务部门的过程
- 子记录所有者不更新
- 子记录的业务单元未更新
- 默认级联分配行为(级联全部)
若同时更新所有者和业务单元:
AlwaysMoveRecordToOwnerBusinessUnit = 假
- 默认级联分配行为(级联全部)
- 将所有者的更新记录转移给新所有者
- 更新记录业务单元为新业务单元
- 子记录的所有者更改为新所有者
- 将子记录的业务单位更新为新的业务单位
- 级联分配设置为“无”
- 将所有者的更新记录转移给新所有者
- 更新记录业务单元为新业务单元
- 不更新子记录所有者
- 不要更新子记录的业务单位
- 默认级联分配行为(级联全部)
注释
当AlwaysMoveRecordToOwnerBusinessUnit = false 时
特权要求:
- 已验证父记录的所有者权限。 更新所有者或业务部门时,验证会先检查所有者是否具有业务部门的权限,然后再允许更新。
- 但子记录的记录所有者权限不会被验证。 可能出现以下情况:当更新父记录的业务单元时,业务单元设置会级联至子记录,导致子记录所有者失去对其记录的访问权限。
示例 1
父记录属于业务单元A的所有者1,其子记录属于业务单元B的所有者2。由于所有者1被分配了来自业务单元A和B的安全角色,因此可以访问这些子记录。 将父记录更新为所有者 3 时,子记录的所有者也会更改为所有者 3,但子记录仍属于业务部门 B。所有者 3 无权访问这些子记录,除非所有者在业务部门 B 中具有安全角色。
示例 2
父记录属于业务单元 A 中的所有者 1,并且其子记录属于业务单元 B 中的所有者 2。所有者 1 从业务单元 A、B 和 C 获得分配的安全角色,因此可以访问这些子记录。 将拥有业务单元更改为业务单元 C 时,这些子记录的业务单元也会更改为业务单元 C。这些子记录的所有者 2 无权访问他们的记录,除非从业务单元 C 分配给他们一个安全角色。
关于重新设定父级的操作
重新设定父级操作与共享操作类似,而它处理的是继承的访问权限,而不是显式访问权限。 当更改父项关系中引用列的值时,将发生重新父项操作。 重新父级操作发生时,ReadAccess, WriteAccess, DeleteAccess, AssignAccess, ShareAccess, AppendAccess, 和AppendToAccess等相关表的继承访问权限所需范围可能会更改。 它不会针对CreateAccess改变。 与重新父子关系相关的级联操作,指的是对表记录及其关联表记录访问权限的变更(如前所述)。
关于合并操作
合并操作在合并系统作业运行时,如果属于操作集的记录被删除,可能无法完成。 此问题常导致错误提示,指出记录存在“父子关系不一致”或子记录“可能失去父子关系”。 如果出现这个问题,并且即使记录缺失你也希望继续合并,那么在选择要合并的列时,可以选择禁用父检查。
注释
在两个自定义表之间执行合并时,DateTime 值不会合并。 目标记录的 DateTime 保持不变。
级联通知
使用两条级联异步通知辅助消息在级联异步作业失败或成功时通知用户并记录日志。 若要实现此解决方案,请编写并注册在处理这些消息时执行的自定义插件,并提供成功或失败通知。
这两条通知消息包括:
| 名称 | 说明 |
|---|---|
cascadeAsync_FailureAPI |
当异步级联作业因多次失败而暂停时,此消息将被处理(执行)。 使用此消息通知用户,他们需要查看其数据集是否存在现有插件问题、数据问题或工作流问题。 InputParameters: casadeAsyncExceptionDetails:导致级联异步作业失败的异常的详细信息。casadeAsyncJobName:级联异步作业的名称。 |
cascadeAsync_SuccessAPI |
异步级联作业成功完成后,将处理此消息。 InputParameters: casadeAsync_JobName:级联异步作业的名称。 |
在作后阶段注册自定义插件,并将其设置为异步模式。 下图显示了使用插件注册工具的示例插件注册。
下面是自定义插件可以提供的通知类型的一些示例:
- 成功后,将条目添加到运行时日志。
- 失败时,将条目添加到运行时日志,然后向管理员发送电子邮件(或其他通信),指示失败的日期和时间和性质。
- 向交互式用户显示消息。
继承的访问修复
将 Reparent 或 Share 作的表关系的级联行为更改为 No Cascade 后,系统会尝试调整用户的继承访问权限以匹配当前表关系级联行为。 深入了解继承访问权限的清理过程。
但是,如果此方法不成功,用户可能会保留对应删除的相关记录的访问权限。 有关解决此问题的步骤,请参阅 “清理继承的访问权限”。