web-dev-qa-db-ja.com

CRMビューに従って、任意のエンティティレコードの監査履歴レコードを取得します

MSCRM形式に従ってすべての監査履歴データを表示したい。

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クエリ 、しかしそれは私に[新しい値]を与えません。

[〜#〜] note [〜#〜]:「RetrieveRecordChangeHistoryResponse」を使用できません。これらのデータをSQLの外部Webページに表示する必要があるためです。テーブル(CRMデータベースではありません)。

7
Chirag

基本的に、Dynamics CRMはSQLクエリを使用してこの監査ビュー(CRMで表示される方法)を作成しません。したがって、成功した場合、Microsoftは、現在よりもはるかに高速であるため、おそらくユーザーから監査ビューを購入します。処理:)

しかし実際には、現在の動作方法では、SQLは関連するすべての監査ビューレコードを取得するためにのみ使用され(属性メタデータなどとの一致はありません)、その後、すべての解析とメタデータとの一致は.NETアプリケーションで実行されます。ロジックは非常に複雑で、処理するケースが非常に多いため、SQLでこれを再作成するには、単純な「選択」クエリだけでなく、実際には非常に複雑な手順が必要になると思います(それでも十分ではない可能性があります。 CRMのすべてがデータベースに保持されているわけではないため、一部はアプリケーションのライブラリに単純にコンパイルされます)、1人が達成するのに数週間、場合によっては数か月かかります(もちろん、私の意見ですが、T-SQLの第一人者が私を間違っていると証明するかもしれません) 。

だから、私はそれを別の方法で行います-RetrieveRecordChangeHistoryRequest(いくつかの回答ですでに言及されています)を使用して、ある種の.NETアプリケーション(おそらく定期的に実行されている)を使用してすべての監査詳細(すでに解析されて使用できる状態)を取得しますまたは、CRMなどのプラグインによってトリガーされ、ユーザーフレンドリーな形式でデータベースに配置されます。その後、このデータベースを必要な外部アプリケーションで使用できます。

また、私はあなたのコメントを理解していません:

これらのデータをSQLテーブル(CRMデータベースではない)の外部Webページに表示する必要があるため、「RetrieveRecordChangeHistoryResponse」を使用できません。

データを取得するために外部サービスを呼び出すことができない(カスタムサービスを作成でき、CRMサービスを使用する必要がない)が、外部データベースにアクセスできるのはどのような種類のアプリケーションですか?データベースから直接読み取るべきではありません。より良いアプローチは、必要な監査を返すWebサービスを準備し(内部でCRM SDKを使用)、外部アプリケーションによってこのサービスを呼び出すことです。もちろん、外部アプリがデータベースを読み取ることしかできず、カスタムWebサービスを実行できない場合を除きます...

10
Pawel Gradecki

AuditBaseテーブルだけから完全な監査履歴を再構築することはできません。現在の値については、監査対象のテーブルが必要です。

作成する必要のあるクエリは複雑であり、RetrieveRecordChangeHistoryRequestも適切なオプションである場合は、それらを書き込むことを避けることができます。 (SOで FetchXMLを使用して監査レコードの詳細を取得する方法 も参照してください。)

[〜#〜]注[〜#〜]

この回答は、元の質問が拡張される前に、RetrieveRecordChangeHistoryRequestは使用できないと述べて提出されました。

5

コメントで述べたように、監査テーブルには古い値と新しい値がありますが、現在の値はありません。次の更新が発生すると、現在の値が新しい値としてプッシュされます。

OPクエリでは、ab.AttributeMaskはカンマ","で区切られた値を返し、AB.changeDataはチルダ"~"で区切られた値を返します。 続きを読む

"~"で区切られた値をOld Value列として使用しても問題ないと思います。フィールドの現在の値を、New Value列に表示したいと思います。複数のフィールドで監査が有効になっている場合、これは機能しません。 AttributeViewを使用してAttribute maskフィールド値をColumnNumberからCRMフィールドに分割し、必要な結果を取得する必要があります。

まず、以下のリファレンスブログをお勧めします。期待どおりの結果が得られたら、SQLで追加のクエリを使用するか、フロントエンドでC#を使用して、現在のフィールド値を取得できます。ただし、形式を維持するには、値を"~"と再度連結する必要があります。

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

更新:
上記のブログから、フィールドでSPクエリを微調整し、最後のselectステートメントを 'select into'に変換して、ストレージ用の新しいテーブルを作成できます。

前回の実行に基づいてデルタをフェッチするようにストアドプロシージャを変更します。テーブルにデータを入力するために、SQLジョブとスケジュールを毎日実行するように構成します。

次に、必要に応じてデータを選択して表示します。 PowerBIでも3日以内に同じことをしました。

長所/短所:明らかに、この要件はレポートを目的としています。グローバルに報告する要件は、レプリケーションまたはその他の手段によってデータベースをミラーリングし、プラグインまたはオンデマンドのアドホックサービス呼び出しを挿入することによってProdユーザーと非同期サーバーを中断することはありません。さらに、CRMではなくデータベースにオンラインでアクセスできます。車輪の再発明をせず、利用可能なソリューションを前進させない方がよいでしょう。これは私の謙虚な意見であり、マイクロソフトの内部プロジェクトの実装に基づいています。

0
Arun Vinoth