タグ付けされた質問 「change-data-capture」

4
CDCを使用して履歴を追跡する場合
SQL Server変更データキャプチャは、SQL Serverトランザクションログから履歴データを読み取り、特別なテーブルに保存する機能です。 特別なテーブル値関数(TVF)を使用することにより、ユーザーはこのデータをクエリすることができ、特定のテーブルのすべての変更を取得するか、特定の時間内の変更に起因するネット変更のみを取得することができます。 CDCには特定の利点があります 特定のテーブルまたは列のみを追跡するように構成できます。 モデルの変更をある程度まで処理できます。 トランザクションログを処理するため、トリガーほどパフォーマンスに大きな影響を与えません。 簡単に有効/無効にでき、追跡する必要のあるテーブルの追加の列は必要ありません。 また、いくつかの欠点もあります。 履歴データの量は非常に速くなる可能性があります。 誰が変更を行ったかを追跡することはできません(少なくとも削除はできません)。 履歴データはトランザクションログに基づいているため、追いつくのに時間がかかります。 SQL Serverエージェントに依存します。エージェントが実行されていないかクラッシュした場合、履歴は追跡されません。 私はCDCについて多くのことを読みましたが、CDCの使い方を知っていますが、それが自分にとって適切なツールかどうかはまだわかりません。 CDCが適切なツールとなるのはどのタスク/シナリオですか?(たとえば、ユーザーがデータオブジェクトを特定の時点に復元できるようにしますか?監査しますか?データの完全な履歴を表示しますか?) いつCDCを使用せず、カスタムトリガーベースのソリューションに頼るべきですか? 運用データベースでCDCを使用し、運用アプリケーション内でCDCデータを利用しても大丈夫ですか?(例:エンドユーザーに表示する)またはこれは明らかにこの機能の誤用ですか? CDCは監査ツールであるとよく聞きますが、SQL Server Auditの目的はそれではありませんか?両方とも同じタスクの異なるツールですか?または、CDCを他のものに使用できますか? 私の現在のシナリオでは、将来の複数のアプリケーションの基礎となる信頼できるデータフレームワークを構築するように求められます。正確な要件はあいまいですが、1つは、データ履歴を追跡し、他のテーブルのすべての関連データとともに古いエントリを復元できる必要があることです。私は現在、CDCをオプションとして評価していますが、推奨されるユースケースが実際には見つからないため、これが進むべきかどうかは不明です。 私は特定のシナリオに対するアドバイスに感謝しますが、回答では、Change Data Captureを使用するタイミングまたは使用しないタイミングに関する一般的なアドバイスを提供する必要があります。

3
トリガーを使用せずにSQL Serverでクエリを実行するクライアントのIDを見つけますか?
現在Change Data Capture(CDC)を使用してデータの変更を追跡しています。変更を行ったクエリを送信するクライアントのホスト名とIPアドレスを追跡したいと考えています。同じユーザー名でログインしている5つの異なるクライアントがある場合、5つのうちどれがクエリを起動したかを追跡するという難題に直面します。私が見つけた他の疑わしい解決策には、次のコマンドでCDCテーブルを変更することが含まれます。 ALTER TABLE cdc.schema_table_CT ADD HostName nvarchar(50) NULL DEFAULT(HOST_NAME()) ただし、これは、クエリが起動されたサーバーのホスト名を返し、クエリを起動したクライアントのホスト名は返しません。 この問題を回避する方法はありますか?クライアントのホスト名またはIPアドレス(または他の種類の一意のID)をログに記録するのに役立つもの。トリガーを使用したくありません。システムが遅くなるだけでなく、CDCがシステムテーブルを生成するため、トリガーを設定することは明らかに不可能です。

3
変更データキャプチャ-誰が変更を行ったかを知る方法は?
CDCが特定した変更を誰が行ったかを追跡します。 私の日時ハックの行に沿って、cdc変更追跡テーブルのデフォルト値を持つ新しいフィールドとしてsuser_snameを追加することにより、同じアプローチを試しました。しかし、これは、cdcプロセスの所有者を返すようであり、ベーステーブルで変更を開始したユーザーを返しません。私もoriginal_loginを試しましたが、sqlサービスアカウントのログインが返されます。繰り返しますが、おそらく変更を開始したユーザーではなく、cdcプロセスに関連付けられています。 私はスタックオーバーフローで同様の質問を見つけましたが、フロントエンドからの変更を追跡するか、トリガーを介する以外に回答はありませんでした。これは、cdcを使用する目的に反するようです。私は再投稿しませんが、元のものがスタックオーバーフローにあったので、特にR2または2012がより良い方法を導入している場合は、ここで試してみようと思いました。 つまり、要するに、変更データキャプチャで誰が変更を行ったかを知るにはどうすればよいのでしょうか。

1
バックアップファイルにCDCが含まれているかどうかを確認するにはどうすればよいですか?
SQL Server 2008から2014までを使用して、Change Data Capture(CDC)を有効にしてデータベースをバックアップおよび復元する方法を知っていますが、私が探しているのは、フルバックアップファイルをクエリして、CDCデータが含まれているかどうかを確認する方法です。 以下のような方法だろう、何が素晴らしいことだRESTORE FILELISTONLYデータベースからファイルリストを取得しますが、代わりに、リストアがKEEP_CDCフラグを使用する必要がありますかどうかを判断するためにCDCの状態を取得していますか? バックアップにCDCデータが含まれているかどうかを確認する方法はありますか? ありがとう!

2
変更データキャプチャと__ $ update_maskバイナリ
CDCを使用して、プロダクションテーブルに加えられた変更をキャプチャしています。変更された行は、データウェアハウス(informatica)にエクスポートされます。__ $ update_mask列には、更新された列がvarbinary形式で格納されていることを知っています。また、さまざまなCDC関数を使用して、そのマスクからそれらの列が何であるかを確認できることも知っています。 私の質問はこれです。誰かがそのマスクの背後にあるロジックを定義して、倉庫で変更された列を特定できるようにできますか?サーバーの外で処理しているため、これらのMSSQL CDC関数に簡単にアクセスできません。自分でマスクをコードで分解するだけです。SQL側のcdc関数のパフォーマンスは、このソリューションでは問題があります。 要するに、変更された列を__ $ update_maskフィールドから手動で識別したいと思います。 更新: 別の方法として、変更された列の人間が読めるリストを倉庫に送信することも可能でした。これは、元のアプローチよりもはるかに優れたパフォーマンスで実行できることがわかりました。 以下のこの質問に対するCLRの回答は、この代替案を満たし、将来の訪問者のためのマスクの解釈の詳細が含まれています。ただし、XML PATHを使用した受け入れられた答えは、同じ最終結果に対しては最速です。

3
SQL Server CDCでの変更の日時のキャプチャ
そこで、本番データベースの1つで変更データキャプチャを使用して調査を開始しました。各変更の日時を知りたいのですが。ウォークスルーやチュートリアルなどを読むと、標準的なアプローチは、LSNを使用してcdc.lsn_time_mappingシステムテーブルに関連付けることです。このアプローチは機能しますが、1日に数十万の変更について話す場合、それほど単純ではなく、効率的でもありません。 テスト環境で、変更トラックテーブルに次の調整を行いました。ALTER TABLE末尾に列を追加するステートメントを発行し、[__ChangeDateTime]それをデフォルト値にしましたGetDate()。アプローチは機能しているようですが、変更の追跡は引き続き正常に機能し、日時が取得されています。 しかし、システムテーブルをいじくり回すと、少し緊張します。 これがMicrosoftが最初から追加したシステムフィールドでない場合は、理由があったはずです。代わりに、LSNからcdc.lsn_time_mappingへのアプローチを選択したので、この方法で独自のハックを作成することで、問題に備えていますか? 更新: テスト中にGetDate()が時々私たちのニーズに対して十分に正確ではないことが発見されました-同じ時間を共有する複数の変更。sysdatetime()およびdatetime2を使用して値をナノ秒に移動することをお勧めします。2008+のオプションのみ明らかに。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.