2017-06-01 14 views
0

ユーザー "123"がアプリケーションにログインした後、データベース内のデータに変更を加えたときに、この変更がミラーテーブルに記録され、 123 "と表示されます。SQL Server:アプリケーションユーザーに基づいてデータベースの変更をログに記録する

"挿入された"または "削除された"をミラーテーブルに保存するというアイデアがありましたが、アプリケーションは常に同じデータベースユーザーを使用しているため、アプリケーションユーザーをデータベースに接続する必要がありますどういうわけか。

私の考えは、ユーザーがアプリケーションにログインするときにアプリケーションのユーザーと一緒に@@ SPIDをテーブルに保存することでした。残念ながら、同じADOConnectionクラスを使用していても、すべてのクエリで@@ SPIDが異なる可能性があると考えました。

同じサーバー上の異なるユーザーが同じアプリケーションを起動する可能性があり、最初のユーザーが行った変更を2番目の変更から区別できる必要があるため、アプリケーション名またはホスト名を使用できませんユーザーがしました。

アプリケーションが非常に大きいので、手動で変更を記録するようにすべてのクエリを更新することは現在オプションではありません。

他にもこの問題の解決策がありますか?

+0

https://stackoverflow.com/questions/648166/how-to-get-windows-log-in-user-name-for-a-sql-log-in-userに似ています – PacoDePaco

+0

あなたのusrsドメインユーザーはいますか?アプリケーションからSQL Serverログインを使用してサーバーにログインするユーザーのドメインアカウントを知りたいですか? – sepupic

答えて

0

実際には自分自身で解決策を見つけました。host_process_idを使用してください。

基本的に、アプリケーションユーザがログインすると、dm_exec_sessionsシステムテーブルのhost_process_idに接続できます。次にトリガが実行されると、host_process_idを@@ SPIDから取得して、どのユーザが変更を行ったかを知ることができます。

@@ SPIDが変更された場合でも、host_process_idは変更されませんが、同じアプリケーションが同じサーバー上で2回実行された場合、異なる値になります。

0

変更/挿入/削除されたレコードに関して各テーブルのユーザー情報を取得する最も良い方法は、ユーザーがレコードを変更するときは、IDのような彼の詳細を 'LastModifiedBy'のような列に更新します。これは、ユーザー情報をキャプチャする問題を解決する必要があります.--これと他の方法はありません。

ログを監査する簡単なソリューションは、データベーステーブルでSQL Change Data Captureを有効にすることです。それによって作成されたシステムテーブルに監査情報を記録することができます。ただし、CDCには保存期間がありますが、通常は3日間です。したがって、3日ごとにデータはCDCテーブルから消去されます。 CDCテーブルに情報を永続的に格納できるように、またはCDCテーブルから情報を取り出して別の監査データベースにプッシュするための.Net WindowsサービスまたはSSISパッケージを作成するために、クリーニングを無効にする機会を探ることができます。

関連する問題