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 管道(插件、工作流、回收站)。 快速删除可实现更高的删除吞吐量。
Warning
请勿按本文中所示执行示例。 根据开发环境修改示例代码。 其中一些示例删除了所有帐户,这不是你可能想要执行的操作。
使用“选项”参数
该 Options 参数接受 BulkDeleteOptions 具有以下属性的对象。
| 财产 | 类型 | 默认 | DESCRIPTION |
|---|---|---|---|
CanRecoverDeletedRecords |
布尔 | null (已启用回收站) | 设置为 false 时,批量删除作业删除的记录将被永久删除,无法从回收站恢复。 |
RunJobForSandbox |
布尔 | null (标准管道) | 设置为 true 时,大容量删除作业使用高性能沙盒删除模式,绕过插件、工作流和回收站。 |
重要
包含 BulkDeleteRequest 类的用于 .NET NuGet 包的 Dataverse SDK 尚未更新,以包含新的 Options 属性。 在更新该包之前,可以使用泛型 OrganizationRequest 类访问新属性,并使用“options”参数指定“bulkdelete”请求名称。
示例:Options 参数
以下示例演示如何将 Options 参数与操作或消息请求一起使用 BulkDelete 。
在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"
}
选项参数值
| Scenario | 可以恢复已删除记录 | RunJobForSandbox | Effect |
|---|---|---|---|
| 默认(标准删除) | 为真或省略 | 假或省略 | 记录数据通过标准管道。 已删除的记录将在启用情况下存储于回收站中。 |
| 跳过再利用箱 | 假 | 错误或省略 | 记录通过标准流程。 此作业将绕过回收站。 |
| 沙盒快速删除 | 假 | true | 绕过 SDK 管道和回收站。 最大吞吐量。 |
控制回收站行为
默认情况下,为环境启用回收站时,批量删除作业删除的所有记录将存储在回收站中,然后再删除。 回收站允许管理员恢复意外删除的记录,但会为每个已删除的记录增加大量 I/O 开销。
若要禁用大容量删除作业的回收站,请在参数中CanRecoverDeletedRecords设置为falseOptions。 通过消除以下开销,此设置可以将删除吞吐量增加到大约两倍。
- 创建 DeletedItemReference 记录
- 将记录数据复制到回收站存储表
- 更新每个已删除记录的恢复数据块
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 管道,并使用直接级联引擎删除,实现更高的吞吐量。
启用沙盒快速删除后,将跳过以下内容:
- 预操作和操作后插件执行
- 同步和异步工作流触发器
- 回收站存储(永久删除记录)
- 在“删除”消息上注册的自定义业务逻辑
执行快速删除时,将保留以下内容:
- 基于表关系配置的级联删除规则
- 引用完整性(外键关系)
- 安全特权检查
- 下游复制的同步更改跟踪
重要
沙盒快速删除模式避开了整个 SDK 插件流程。 在“删除”消息上注册的任何自定义插件、工作流或业务逻辑都不会针对在此模式下删除的记录执行。 包括审核插件、集成插件和任何自定义验证逻辑。 此外,沙盒模式下删除的记录无法从回收站恢复。 仅当确定没有关键业务逻辑依赖于删除时插件执行,并且可接受永久不可恢复的删除时,才使用此选项。
示例:沙盒快速删除
了解如何使用高性能沙盒删除模式实现最大吞吐量。
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"
}
Samples
查看以下 SDK for .NET 示例,了解批量删除功能: