Dynamics 365 CE自带的Audit功能,虽然不会给咱们的业务流程带来显著变化,可是这个功能对于咱们追溯数据变化的历史,诊判定制触发的执行,以及数据还原等,都是不可或缺的关键先生。尤为是涉及到多部门合做,在数据变化方面产生“矛盾”的时候,这个功能将成为关键的证据。可是万事有利必有弊,这些Audit log,在SQL里对应的是表记录,也就是说,须要消耗的你的Storage资源。在Dynamics 365 CE从V8升级到V9以后,你也许会发现升级前够用的Storage,在升级以后不够用了,这个的缘由确定方方面面都有,其中一个可能的状况就是Audit log占用的Storage变多了。若是在对环境分析以后,发现真的是因为Audit log的事,那么就继续咱们此次的主题,Delete Audit。spa
CE自带的有Audit Log Management管理功能,里面会显示每一个季度的Audit Log Size,而且还提供Delete功能。code
若是你发现Audit Size太大,能够考虑先把时间比较久的Audit删除掉,以释放一部分Storage。那么若是Audit Size是最近一个季度的比较大呢?因为Audit Log Management的删除功能只是以时间段为条件,不能再细化到Entity级别,这就致使咱们须要考虑如何删除某个Entity的Audit,以及如何删除某个Entity,某个时间段以前的Audit。对象
Dynamics 365目前关于Delete Audit提供了两个API:DeleteRecordChangeHistoryRequest和DeleteAuditDataRequest。blog
DeleteAuditDataRequest是V9之前就有的API,具体的功能有点相似上面的Audit Log Management。就是给一个EndDate,而后发送请求删除这个时间点以前全部的Audit。下面给个官方Code帮助理解:资源
// Get the list of audit partitions. var partitionRequest =(RetrieveAuditPartitionListResponse)svc.Execute(new RetrieveAuditPartitionListRequest()); AuditPartitionDetailCollection partitions = partitionRequest.AuditPartitionDetailCollection; // Create a delete request with an end date earlier than possible. var deleteRequest = new DeleteAuditDataRequest(); deleteRequest.EndDate = new DateTime(2000, 1, 1); // Check if partitions are not supported as is the case with SQL Server Standard edition. if (partitions.IsLogicalCollection) { // Delete all audit records created up until now. deleteRequest.EndDate = DateTime.Now; } // Otherwise, delete all partitions that are older than the current partition. // Hint: The partitions in the collection are returned in sorted order where the // partition with the oldest end date is at index 0. else { for (int n = partitions.Count - 1; n >= 0; --n) { if (partitions[n].EndDate<DateTime.Now && partitions[n].EndDate>deleteRequest.EndDate) { deleteRequest.EndDate=(DateTime)partitions[n].EndDate; break; } } } // Delete the audit records. if (deleteRequest.EndDate != new DateTime(2000, 1, 1)) { svc.Execute(deleteRequest); Console.WriteLine("Audit records have been deleted."); } else Console.WriteLine("There were no audit records that could be deleted.");
这个API在某些时候可能有用,好比想指定具体的时间点,而不是一个季度一个季度地去删除。get
DeleteRecordChangeHistoryRequest是V9之后才有的API,也就是说在使用这个API以前,你得先把你的XRM Dll升级到对应的版本,以及把.Net Framework版本更新到4.6.2,要不你会发现这个对象在使用的时候不存在。这个API的做用,是删除某条具体Entity Record的全部Audit记录。用法是指定Target属性便可,这个是EntityReference对象。it
因为Dynamics 365不支持直接删除Audit记录的操做,就是你若是想先获取Audit记录,而后调用Delete方法去删除某条具体的Audit Record,这个是行不通的。因此综上来看,咱们只有Audit Log Management以及两个API可用。那么再回到上面的问题:如何删除某个Entity的Audit,以及如何删除某个Entity,某个时间段以前的Audit?目前来看,只好利用DeleteRecordChangeHistoryRequest来迂回实现了。io