10

私は現在、時制データベースを保存するオプションとしてChangeDataCaptureを検討しています。デルタのみを保存し、私の問題を解決できるように見えるので、それは素晴らしいことです。CDCを有効にすると、の下にたくさんのテーブルが表示されSystem Tablesました。

クエリcdc.dbo_MyTableを実行すると、テーブルで行われたすべての変更を確認できます。では、どのように履歴ビューを作成しますか?たとえば、特定の日付の時点でのテーブルの状態を確認したい場合、どうすればよいでしょうか。それも可能ですか?

ログを取得して元のテーブルに適用する必要があるようですが、これを行うための組み込みの方法があるかどうか疑問に思いました。助言がありますか?

私が見ているユースケースのいくつか:

  • 特定の時点でのグラフの状態を知る
  • 異なる時間に2つのグラフが与えられた場合、異なるリンクのセットを知ってください(これは、テーブルを作成した後にEXCEPT句を使用して取得できる可能性があります)
4

3 に答える 3

6

それは可能ですが、私が恐れている組み込みの方法ではありません。手作業でタイムラインを再構築する必要があります。

変更追跡テーブルがtran_end_timeを提供する場合、これはプロパティの値が永続化されていると認識される時間であるため、テーブル状態のすべての異なる期間をフェッチするクエリを作成し、追跡されたプロパティの変更に参加する必要があります。次にピボットします(テーブルと同じ形式でプレゼンテーションを行うため)。完全を期すために変更/追跡されていない値を取得するには、テーブルの状態自体と結合することを忘れないでください。

簡略化した最終結果は、次のようになります。

RN PK PropA   PropB   FromDate          ToDate
1  1  'Ver1'  'Ver1'  2012-01-01 09:00  2012-01-02 08:00
2  1  'Ver1'  'Ver2'  2012-01-02 08:00  2012-01-03 07:00
3  1  'Ver2'  'Ver2'  2012-01-03 07:00  *getdate()*
4  2  'Ver1'  'Ver1'  2012-01-01 05:00  2012-01-02 06:00
5  2  'Ver1'  'Ver2'  2012-01-02 06:00  2012-01-03 01:00
6  2  'Ver2'  'Ver2'  2012-01-03 01:00  *getdate()*

getdate()は、行が削除されていない場合に有効であることに注意してください。削除されていない場合は、削除日で置き換える必要があります。

編集、2つのユースケース。最初のポイントは簡単に対処できます。これは、時間オブジェクトグラフを作成してからフィルタリングすることです。

declare @pointInTime datetime = '20120102 10:00';
select * from Reconstructed_TG where FromDate <= @pointInTime and @pointInTime < ToDate

2番目のポイントは、ご指摘のとおり、EXCEPT句を使用して簡単に生成できます。上記のクエリが与えられた場合:

declare @pointInTimeA datetime = '20120102 10:00';
declare @pointInTimeB datetime = '20120103 01:00';
select * from Reconstructed_TG where FromDate <= @pointInTimeA and @pointInTimeA < ToDate
EXCEPT
select * from Reconstructed_TG where FromDate <= @pointInTimeB and @pointInTimeB < ToDate

ただし、このexcept句は、少なくとも1つの異なる列値を持つ行のみを示します。その情報が人間の目に本当に意味があるかどうかはわかりません。ニーズによっては、データを直接処理するクエリのcdc方が適切な場合があります。

于 2012-08-14T12:44:54.313 に答える
0

2005年以降SQLServerに組み込まれているスナップショットを確認することをお勧めします。

これらは、必要な時点が少ない場合に最も役立ちますが、複雑なデータベース内のすべてのテーブルを追跡するのに役立ちます。

これらはデルタなので、Compared to a full copy of a database, however, snapshots are highly space efficient. A snapshot requires only enough storage for the pages that change during its lifetime. Generally, snapshots are kept for a limited time, so their size is not a major concern.

于 2012-08-14T16:53:51.967 に答える
0

これについてはよくわかりません。そのようなことは決してしませんが、トランザクションが発生するたびにmax(changeset)を取得するたびに、テーブルに加えた変更を追跡できる列「changeset」をテーブルに追加できます。 )そして、次の値で新しい変更を保存します...または、タイムスタンプがあり、特定の時点でのテーブルのステータスを知りたい場合は、クエリを実行して、確認する日付より前の変更をフィルタリングします...(わからない私がこれを書くべきなら、これは答えまたはコメントとしてです...私はここで新しいです)

とにかく、それが役立つことを願っています...

于 2012-08-17T01:01:42.417 に答える