web-dev-qa-db-ja.com

DB2でレコードを更新したのは誰ですか?更新前のレコードはどのように見えましたか?

(SQL Server 2008 R2 Standard、データベースは完全復旧中)

フィールドid、firstname、lastnameを持つテーブルがあります。ステートメントが実行されます。

insert into dbo.sometable (id, firstname, lastname) values (1, 'John', 'Smith')

数時間後、別のステートメントが実行されます:

update dbo.sometable set firstname='Matt' where id=1

レコードの履歴を確認できる方法またはツールはありますか(レコードがY日付でX日に挿入され、これらが挿入された値であり、同じレコードがB日付でA日付で更新され、これらは更新後の新しい値でした)?

DB2 for i(つまり、iSeries上のDB2)に精通しているユーザーは、CRTDBFJRNと呼ばれるTAAツールセットコマンドを知っているかもしれません。更新しました。

SQL Server EnterpriseにはCDCがありますが、Standardエディションがあります。トリガーを使用して、監査テーブルに格納することにより、変更されたデータを追跡できます。トリガーを使用するには、さらに2つのオブジェクト(トリガーと監査テーブル)が必要です。トリガーは変更ごとに起動されます。ツールがトランザクションファイルからオンデマンドでトランザクションを再生できれば、すばらしいでしょう。

監査人が財務記録(たとえば、1日に挿入および更新された)の履歴を要求したときに、どのツールを使用するか、どのタスクを実行しますか。入力した、オリジナル入力時のデータなどは何でしたか?

どんな助けでもありがたいです。ありがとうございました。

6
Ano

いつ、誰が、どのコンピュータとアプリケーションを使用するかなど、トランザクションに関する情報を提供できる2つのツールをテストしました

ApexSQL Audit は、監査トリガーを作成するため、テーブルごとにトリガーをコーディングおよび作成するのが難しい場合、これはオプションです

enter image description here

2つの組み込みレポートがあり、キャプチャされたすべてのトランザクションを2つのテーブルに保存するので、それらに対してクエリを実行し、必要な情報を抽出できます。

enter image description here

残念ながら、それはトランザクションを再生できません

もう1つは ApexSQL Log です。トランザクションログとtrnバックアップを読み取るため、データベースは完全復旧モデルである必要があります。データトランザクションの他に、スキーマの変更(テーブルの作成、関数の変更など)も追跡し、トランザクションを再生できます。

enter image description here

6

私はちょうど遭遇した StandardCDC これは興味深いかもしれません:

StandardCDCは、指定されたテーブルのデータ操作言語(DML)の変更をキャプチャし、結果をリレーショナル形式で保存します。キャプチャテーブルは、追跡されたオブジェクトの列リストをミラーリングし、特定の列のみを保存するためのオプションを備えています。

5
Chris Oates

トリガーと監査/履歴テーブル。挿入/更新用のメインテーブルの列

  • 履歴テーブルは簡単に照会され、監査人に示すことができます
  • 異なるRDBMSに共通
  • トリガーはトランザクションの一部であるため、履歴書き込みなし=書き込みなし

監査/履歴テーブルから、いつでもデータベースの状態を取得できます。

編集:

テーブルへの複数の書き込みパスがあることは非常に一般的であり、トリガーによって変更が確実にキャプチャされます。これは、テーブル値パラメーターを使用して、他のコードによって呼び出される1つのストアドプロシージャのみが実際に書き込むことを許可する場合に変更されます。

また、実際のエンドユーザーがプロキシから離れている場合(Webサーバー経由など)に、クライアントコードで資格情報を渡す(またはパススルーを有効にする)必要があることも考慮する必要があります。

4
gbn

変更の追跡は、Standard Editionで使用できます。データへの変更を追跡することはできますが、誰が変更したかを知ることはできません。

オプションは基本的に次のとおりです。

  1. トリガー-おそらくトリガーの代わりに使用することもできます-更新の場合、行の現在のコピーを履歴テーブルに移動し、アクティブなコピーで置き換えることができます。
  2. enterpriseに移動し、SQL Server AuditやCDCを使用します。
  3. 24/7トレースを実行する
  4. ユーザーによるテーブルの更新などのアドホッククエリの実行を許可しない。ストアドプロシージャを介してデータアクセスを制御する場合、すべてのテーブルにトリガーを追加したり、より高価なエディションに移動したりすることなく、必要なすべてのロギングを実行できます(ビジネスルールによってはそれをバイパスすることもできます)。
3
Aaron Bertrand

Aaronとgbnによって書かれたものを除く他のオプション:

  • サードパーティの監査ツール(redgate、lumigent ...)を使用する
  • fn_dblogシステム関数を使用してカスタムパッケージを実装する(トランザクションログを読み取る)
  • 24時間年中無休のサーバートレースを使用します(アーロンは既に言及しています)
3
Marian

SQL2008には、使用可能なCHANGETABLEという新機能があります。詳細については、この link を確認してください。 CHANGETABLEは、テーブルの変更追跡情報を返します。このステートメントを使用して、テーブルのすべての変更、または特定の行の変更追跡情報を返すことができます。

1
StanleyJohns

私はオープンソーサラーであり、Change Data Captureが必要とするSQL Enterprise EditionのMSライセンス料金を支払う余裕はありません。

私はgithub上で yact を開発しました。これは、単純なSQLトリガーを使用して5W(誰が、いつ、どこで、なぜ、何を)を格納するかです。データの前後の画像をXMLとして保存します。

0