Dynamics 365 Online-Delete Audit History Data

  Dynamics 365 CE自带的Audit功能,虽然不会给我们的业务流程带来显著变化,但是这个功能对于我们追溯数据变化的历史,诊断定制触发的执行,以及数据还原等,都是不可或缺的关键先生。尤其是涉及到多部门合作,在数据变化方面产生“矛盾”的时候,这个功能将成为关键的证据。但是万事有利必有弊,这些Audit log,在SQL里对应的是表记录,也就是说,需要消耗的你的Storage资源。在Dynamics 365 CE从V8升级到V9之后,你也许会发现升级前够用的Storage,在升级之后不够用了,这个的原因肯定方方面面都有,其中一个可能的情况就是Audit log占用的Storage变多了。如果在对环境分析之后,发现真的是由于Audit log的事,那么就继续我们这次的主题,Delete Audit。

  CE自带的有Audit Log Management管理功能,里面会显示每个季度的Audit Log Size,并且还提供Delete功能。

  如果你发现Audit Size太大,可以考虑先把时间比较久的Audit删除掉,以释放一部分Storage。那么如果Audit Size是最近一个季度的比较大呢?由于Audit Log Management的删除功能只是以时间段为条件,不能再细化到Entity级别,这就导致我们需要考虑如何删除某个Entity的Audit,以及如何删除某个Entity,某个时间段之前的Audit。

  Dynamics 365目前关于Delete Audit提供了两个API:DeleteRecordChangeHistoryRequest和DeleteAuditDataRequest。

  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在某些时候可能有用,比如想指定具体的时间点,而不是一个季度一个季度地去删除。

 

  DeleteRecordChangeHistoryRequest是V9以后才有的API,也就是说在使用这个API之前,你得先把你的XRM Dll升级到对应的版本,以及把.Net Framework版本更新到4.6.2,要不你会发现这个对象在使用的时候不存在。这个API的作用,是删除某条具体Entity Record的所有Audit记录。用法是指定Target属性即可,这个是EntityReference对象。

  由于Dynamics 365不支持直接删除Audit记录的操作,就是你如果想先获取Audit记录,然后调用Delete方法去删除某条具体的Audit Record,这个是行不通的。所以综上来看,我们只有Audit Log Management以及两个API可用。那么再回到上面的问题:如何删除某个Entity的Audit,以及如何删除某个Entity,某个时间段之前的Audit?目前来看,只好利用DeleteRecordChangeHistoryRequest来迂回实现了。

  

 

posted @ 2019-05-14 15:21  YOBYRON  阅读(562)  评论(1编辑  收藏  举报