2017-08-03 128 views
4

我想按照MS CRM格式显示所有审计历史记录数据。按照CRM视图获取任何实体记录的审计历史记录

enter image description here

我已汇入AuditBase表中的所有记录,从CRM到另一台数据库服务器表。

我想要这个表格记录使用Dynamics CRM格式的SQL查询(按照上面的图片)。

我已经做了迄今为止

select 
AB.CreatedOn as [Created On],SUB.FullName [Changed By], 
Value as Event,ab.AttributeMask [Changed Field], 
AB.changeData [Old Value],'' [New Value] from Auditbase AB 

inner join StringMap SM on SM.AttributeValue=AB.Action and SM.AttributeName='action' 
inner join SystemUserBase SUB on SUB.SystemUserId=AB.UserId 

--inner join MetadataSchema.Attribute ar on ab.AttributeMask = ar.ColumnNumber 
--INNER JOIN MetadataSchema.Entity en ON ar.EntityId = en.EntityId and en.ObjectTypeCode=AB.ObjectTypeCode 

--inner join Contact C on C.ContactId=AB.ObjectId 
where objectid='00000000-0000-0000-000-000000000000' 
Order by AB.CreatedOn desc 

我的问题是AttributeMask是一个逗号分隔值,我需要与MetadataSchema.Attribute表的得到columnnumber场比较。以及如何从该实体获得新的价值。

我已经检查了这个链接:Sql query to get data from audit history for opportunity entity,但它没有给我[新价值]。

注意:我不能使用“RetrieveRecordChangeHistoryResponse”,因为我需要从SQL表(不是CRM数据库)在外部网页中显示这些数据。

+0

你可能要张贴到目前为止你已经尝试的SQL代码... – Aron

+0

审计表将具有旧值和新值,但不是当前值。下次更新时,当前值将作为新值推送。 –

+0

来帮助你 - https://marcuscrast.wordpress.com/2012/01/14/dynamics-crm-2011-audit-report-in-ssrs/ –

回答

5

无法仅从AuditBase表重建完整的审计历史记录。对于当前值,您仍然需要正在审计的表。

您需要构建的查询非常复杂,如果RetrieveRecordChangeHistoryRequest也是合适的选项,则可以避免编写它们。 (另见SO How to get audit record details using FetchXML

注意

这个答案提交延长原来的问题之前,指出RetrieveRecordChangeHistoryRequest不能使用。

+1

我同意Henk的看法,您可能最好使用RetrieveRecordChangeRequest来反规范化AuditBase信息,然后将结果推送到SQL(如有必要)。这个项目的最终目标是什么?无论哪种方式,如果您正在使用.NET方法,您可能会发现此MSDN示例有用:https://msdn.microsoft.com/en-us/library/gg309735(v=crm.8).aspx – Aron

-2

正如我在评论中所说,审计表将具有旧值&新值,但不是当前值。下次更新时,当前值将作为新值推送。

在你的OP查询,ab.AttributeMask将返回逗号分隔","价值观和AB.changeData将返回波浪"~"分隔值。

我假设你没有问题,"~"分开的值为Old Value列,想要显示New Value列的字段当前值。当启用多个字段进行审计时,这不起作用。您必须使用ColumnNumber &将Attribute mask字段值从AttributeView分成CRM字段,以获得所需结果。

我会推荐下面的参考博客开始,一旦你得到预期的结果,你可以使用额外的查询或SQL或在前端使用C#拉取当前字段值。但是您应该再次与"~"连接以获取值以保持格式。

https://marcuscrast.wordpress.com/2012/01/14/dynamics-crm-2011-audit-report-in-ssrs/

更新:
从上面的博客,你可以用你的领域调整的SP查询,然后转换成最后的SELECT语句“选择进入”创建一个新表为您的存储。

修改存储过程来获取基于上次运行的增量。配置SQL作业&计划每天运行一次,以填充表。

然后选择&显示的数据,你想要的方式。我在3天之内在PowerBI中做过同样的事情。

优点/缺点:显然,这要求报告的目的。在全球范围内报告的要求,将通过镜像复制或其他方式的数据库,并不会&异步服务器通过注入插件或任何按需自组织服务电话被中断督促用户。此外,您可以访问数据库&而不是联机CRM。最好不要重新发明轮子&采取可用的解决方案。这是我基于微软内部项目实施的愚蠢观点&。

10

好了,基本上Dynamics CRM中不会产生这种审计视图使用SQL查询,所以如果你在做成功,微软可能会从你买它(你看到它在CRM的方式),因为它会大大快于它目前处理的方式:)

但是真的 - 它当前的工作方式是,SQL仅用于获取所有相关的审核视图记录(没有与任何属性元数据匹配),然后,所有的解析和匹配元数据在.NET应用程序中完成。这个逻辑非常复杂,有很多不同的情况需要处理,我相信在SQL中重新创建这个请求不仅需要一些简单的“select”查询,而且实际上还需要一些非常复杂的过程(并且这还不够,因为并不是CRM中的所有东西都保存在数据库中,有些东西只是被编译到应用程序库中),几个星期甚至几个月才能完成(当然,这是我的观点,也许一些T-SQL专家会证明我错了) 。

所以,我会采取不同的方式 - 使用RetrieveRecordChangeHistoryRequest(在某些答案已经提到)来获取所有审计详细使用某种类型的.NET应用程序(大概定期运行,或(已经被解析并准备使用)可能由CRM中的插件等触发),并以用户友好的格式将它们放入某个数据库。然后,您可以使用任何需要的外部应用程序来使用此数据库

此外,我不明白您的评论:

我不能用“RetrieveRecordChangeHistoryResponse”,因为我需要 从SQL表(未CRM数据库)

显示外部网页,这些数据

什么样的应用程序无法调用外部服务(您可以创建自定义服务,不必使用CRM服务)来获取一些数据,但可以访问外部数据库?您不应该直接从数据库读取数据,更好的方法是准备一个返回您想要的审计的Web服务(使用底层的CRM SDK)并通过外部应用程序调用该服务。当然,除非你的外部应用程序只能够读取数据库,不运行任何自定义Web服务...

+1

我的CRM 2013实例已关闭,如何使用CRM服务及其记录? – Chirag