zoukankan      html  css  js  c++  java
  • 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来迂回实现了。

      

  • 相关阅读:
    摩尔定律 四
    为什么要重载new? 四
    JS 完美识别IE FIREFOX CHROME safari
    Chrome的JS调试工具
    JetBrains WebStorm 6注册码(其实版本v4, v5, v6都通用)
    require.js 入门学习
    str_replace、preg_replace、strtr比较
    获取当前IP地址,跳转到对应城市网站。
    mysql大数据高并发处理(转)
    SESSION的安全性(转)
  • 原文地址:https://www.cnblogs.com/yobyron/p/10862373.html
Copyright © 2011-2022 走看看