Microsoft Dataverse 中的批量删除功能有助于通过删除不再需要的数据来维护数据质量和管理系统存储的消耗。 例如,您可以批量删除下列数据:
- 过时数据
- 不再与业务相关的数据
- 不需要的测试或示例数据
- 从其他系统错误导入的数据
您可以执行以下操作:
- 跨多个表删除数据。
- 删除特定表中的记录。
- 批量删除完成后接收电子邮件通知。
- 定期删除数据。
- 安排定期批量删除的开始时间。
- 检索有关批量删除期间发生的失败的信息。
若要删除弹性表中的多行,还可以使用该 DeleteMultiple 消息。
DeleteMultiple 会立即删除单个弹性表中的记录,而不是使用批量删除作业。
运行批量删除
若要批量删除数据,请使用 BulkDelete 消息提交批量删除作业。 使用 SDK 时,请使用 BulkDeleteRequest 类。 使用 Web API 中的 BulkDelete 操作。 请在请求的 QuerySet 属性中指定用于描述要删除记录的查询表达式。
批量删除作业由表Bulk Delete Operation(BulkDeleteOperation)中的记录表示。 批量删除操作记录包括以下信息:
- 作业删除的记录数
- 作业未能删除的记录数
- 作业是否设置为重复执行
- 作业的开始时间
批量删除作业以异步方式运行,而不会阻止其他活动。 它只会删除在作业开始运行之前创建的记录。 该作业将根据表关系级联行为中的级联规则删除指定的记录。
如果大容量删除作业失败或过早结束,则操作不会回滚任何已删除的记录。 记录数据仍然被删除。 故障记录存储在 Bulk Delete Failure (BulkDeleteFailure) 表中。 可以从表中检索导致失败的错误的相关信息。
若要运行批量删除作业,必须对要删除的表类型拥有 BulkDelete 和 Delete 特权。 还必须对属性中指定的 QuerySet 表记录具有读取权限。 默认情况下,系统管理员具有必要的权限。 将其授予其他用户。
可以对支持 Delete 消息的所有表执行批量删除。
如果特定表类型的删除操作触发插件或工作流(进程),则每次删除该类型的表记录时,大容量删除作业都会触发插件或工作流。
控制批量删除处理
Options
BulkDelete上的 参数控制批量删除作业如何处理表中的行(记录)。 使用此参数可:
- 关闭对已批量删除记录的已删除记录保留功能。 关闭已删除记录保留功能可通过省去为恢复而存储已删除记录的额外开销来提高性能。
- 启用沙盒快速删除模式以绕过标准 SDK 管道(插件、工作流、已删除的记录保留)。 快速删除可实现更高的删除吞吐量。 此属性仅在沙盒环境中受支持。 在其他环境类型(包括生产)上使用时,删除遵循标准流程,并遵循插件、工作流和已删除的记录保留策略。
注释
计划在未来版本中支持在 .NET SDK 中使用新的 Options 参数来控制批量删除处理。
使用“选项”参数
该 Options 参数接受 BulkDeleteOptions 具有以下属性的对象。
| 财产 | 类型 | Default | Description |
|---|---|---|---|
CanRecoverDeletedRecords |
布尔 | null(已开启已删除记录保留) | 设置为 false 时,大容量删除作业删除的记录将被永久删除,并且无法恢复。 如果该环境已关闭已删除记录保留功能,则即使将 CanRecoverDeletedRecords 设为 true,也不会为此作业保留已删除记录以供后续恢复。 |
RunJobForSandbox |
布尔 | null (标准管道) | 设置为 true 时,批量删除作业将使用高性能沙盒删除模式,绕过插件、工作流以及已删除记录保留。 此属性尤其适用于在生产环境复制后从沙盒环境中删除大量数据。 仅在沙盒环境中受支持。 在其他环境类型(包括生产)上使用时,删除遵循标准流程,并遵循插件、工作流和已删除的记录保留策略。 |
Warning
不要按照本文中所示的示例运行。 根据开发环境修改示例代码。 其中一些示例删除所有帐户,这不是你想要执行的操作。
示例:Options 参数
以下示例演示如何在 Options 操作中使用 BulkDelete 参数。
在Options的请求正文中使用属性。 参数 Options 是 BulkDeleteOptions 复杂类型。
请求:
POST [Organization Uri]/api/data/v9.2/BulkDelete HTTP/1.1
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
Content-Type: application/json
{
"QuerySet": [
{
"@odata.type": "Microsoft.Dynamics.CRM.QueryExpression",
"EntityName": "account",
"ColumnSet": {
"AllColumns": true
},
"Distinct": false
}
],
"JobName": "Delete all accounts",
"SendEmailNotification": false,
"ToRecipients": [],
"CCRecipients": [],
"RecurrencePattern": "",
"StartDateTime": "2026-03-13T06:30:00Z",
"Options": {
"CanRecoverDeletedRecords": true,
"RunJobForSandbox": false
}
}
响应:
HTTP/1.1 200 OK
OData-Version: 4.0
{
"@odata.context": "[Organization Uri]/api/data/v9.2/$metadata#Microsoft.Dynamics.CRM.BulkDeleteResponse",
"JobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
选项参数值
| 情景 | 可以恢复已删除记录 | RunJobForSandbox | Effect |
|---|---|---|---|
| 默认(标准删除) | 为真或省略 | 假或省略 | 记录继续使用标准删除管道。 如果该环境已关闭已删除记录保留功能,则将 CanRecoverDeletedRecords 设为 true 也不会为此作业保留已删除记录供后续恢复。 |
| 跳过保留已删除的记录 | false | 假或省略 | 记录继续使用标准删除流程,但会绕过该作业的已删除记录保留机制。 如果环境已启用已删除记录保留功能,则将 CanRecoverDeletedRecords 设置为 false 会对此特定作业绕过已删除记录保留。 |
| 沙盒快速删除 | false | True | 绕过已删除记录保留机制和 SDK 处理管道。 最大吞吐量。 |
控制已删除的记录保留行为
默认情况下,为你的环境启用“保留已删除记录”功能后,系统会在批量删除作业删除所有记录之前,先保留这些记录。 保留已删除记录有助于管理员恢复误删的记录,但会为每条已删除记录带来显著的 I/O 开销。
若要绕过批量删除作业的已删除记录保留,请在Options参数中将CanRecoverDeletedRecords设置为false。 通过消除以下开销,此设置可以将删除吞吐量增加到大约两倍。
- 创建
DeletedItemReference记录 - 将记录数据复制到 bin 存储表以供以后恢复
- 更新每个已删除记录的恢复数据块
Warning
如果设置为 CanRecoverDeletedRecords false,大容量删除作业将永久删除已删除的记录,并且无法恢复这些记录。 此操作不可逆。 使用此选项运行批量删除作业之前,请确保已验证查询条件并具有适当的备份。 此设置仅影响当前批量删除作业;它不会更改环境级删除的记录保留配置。
示例:禁用已删除记录保留,以加快删除过程
永久删除记录,而无需存储这些记录以供以后恢复。
POST [Organization Uri]/api/data/v9.2/BulkDelete HTTP/1.1
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
Content-Type: application/json
{
"QuerySet": [
{
"@odata.type": "Microsoft.Dynamics.CRM.QueryExpression",
"EntityName": "account",
"ColumnSet": {
"AllColumns": true
},
"Distinct": false
}
],
"JobName": "Delete accounts - skip recycle bin",
"SendEmailNotification": false,
"ToRecipients": [],
"CCRecipients": [],
"RecurrencePattern": "",
"StartDateTime": "2026-03-13T06:30:00Z",
"Options": {
"CanRecoverDeletedRecords": false
}
}
沙盒快速删除
对于需要最大删除吞吐量的场景,将RunJobForSandbox设置为true以启用沙盒快速删除模式。 在此模式下,批量删除作业完全绕过标准 SDK 管道,并使用直接级联引擎删除,因此可以获得更高的吞吐量。
Important
此属性尤其适用于在生产环境复制后从沙盒环境中删除大量数据。 它仅在沙盒环境中受支持。 在其他环境类型(包括生产)上使用时,删除遵循标准流程,并遵循插件、工作流和已删除的记录保留策略。
启用沙盒快速删除后,将跳过以下操作:
- 预操作和操作后插件执行
- 同步和异步工作流触发器
- 已删除的记录保留(记录被永久删除)
- 在“删除”消息上注册的自定义业务逻辑
该过程在执行快速删除时会保留以下元素:
- 基于表关系配置级联删除规则
- 引用完整性(外键关系)
- 安全特权检查
- 下游复制的同步更改跟踪
Important
沙盒快速删除模式绕过整个事件框架插件管道。 在“删除”消息上注册的任何自定义插件、工作流或业务逻辑不会针对在此模式下删除的记录执行。 此限制包括审核插件、集成插件和任何自定义验证逻辑。 此外,不能恢复在沙盒模式下删除的记录。 仅当确定没有关键业务逻辑依赖于删除时插件执行,并且可接受永久不可恢复的删除时,才使用此选项。
示例:沙盒快速删除
了解如何使用高性能沙盒删除模式实现最大吞吐量。
POST [Organization Uri]/api/data/v9.2/BulkDelete HTTP/1.1
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
Content-Type: application/json
{
"QuerySet": [
{
"@odata.type": "Microsoft.Dynamics.CRM.QueryExpression",
"EntityName": "account",
"ColumnSet": {
"AllColumns": true
},
"Distinct": false
}
],
"JobName": "Delete accounts - sandbox fast delete",
"SendEmailNotification": false,
"ToRecipients": [],
"CCRecipients": [],
"RecurrencePattern": "",
"StartDateTime": "2026-03-13T06:30:00Z",
"Options": {
"CanRecoverDeletedRecords": false,
"RunJobForSandbox": true
}
}
长期保留的数据
批量删除也可用于长期保留的数据。 像平常一样运行批量删除,但将查询的 DataSource 字段设置为 保留。
在 Web API QueryExpression中将DataSourceretained属性设置为指示查询仅用于保留的行。
请求:
POST [Organization Uri]/api/data/v9.2/BulkDelete HTTP/1.1
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
Content-Type: application/json
{
"QuerySet":
[
{
"EntityName": "contact",
"DataSource": "retained",
"Criteria":
{
"FilterOperator": "And",
"Conditions":
[
{
"AttributeName": "firstname",
"Operator": "Equal",
"Values" : [{"Value":"Bob","Type":"System.String"}]
}
]
}
}
],
"JobName": "Bulk Delete Retained Contacts",
"SendEmailNotification": false,
"RecurrencePattern": "",
"StartDateTime": "2023-03-07T05:00:00Z",
"ToRecipients": [],
"CCRecipients": []
}
响应:
HTTP/1.1 200 OK
{
"@odata.context": "[Organization Uri]/api/data/v9.1/$metadata#Microsoft.Dynamics.CRM.BulkDeleteResponse",
"JobId": "3093d67f-21f0-ed11-8b48-6045bdd92a32"
}
样品
若要了解有关批量删除功能的详细信息,请参阅以下 SDK for .NET 示例: