4

テーブルの更新と削除を監査するトリガーを作成しています。SQLServer2008を使用しています

私の質問は、

削除および挿入されたテーブルの選択フェーズを経ることなく、レコードに対してどのようなアクションが実行されているかを確認する方法はありますか?

もう1つの質問は、レコードが削除されている場合、削除を実行しているユーザーを監査テーブル内に記録するにはどうすればよいですか。(注:データベースに接続しているユーザーは、設定されたユーザーとの一般的な接続文字列です。WebアプリまたはWindowsアプリのいずれかにログインしているユーザーが必要です)

助けてください?

4

4 に答える 4

4

これを考慮してください。実際にレコードを削除せずに、レコードを削除済みとしてマークするフィールドを追加すると、最後に変更されたユーザーを取得できます。実際にレコードを削除したい場合は、一度に1つずつではなく、バッチで削除する夜間のジョブを実行できます。これは、削除されて実行されていないレコードが多すぎる場合にフラグを立てるように設定することもできます。

これを実行して何も中断しないようにする最も簡単な方法は、テーブルの名前を変更し、列IsDeletedをビットフィールドとして追加してから、テーブルが最初に呼び出されたのと同じ名前のビューを作成することです。ビューは、isdeltedがnullであるすべてのレコードを選択します。

このためのトリガーの使用について、だれにも話させないでください。不正な変更を行っている人が監査から逃れることができないようにする必要があります。トリガーを使用すると(そして、実動のdba以外のユーザーがテーブルを変更する権限がない場合)、dba以外のユーザーは監査なしで削除できません。テーブルへの直接アクセスを制限するためのストアドプロシージャがない一般的なシステムでは、通常、あまりにも多くの人がテーブルに直接影響を与えて、不正のためにテーブルを大きく開く可能性があります。詐欺を犯した人々は通常、データを変更するために使用することになっているアプリケーションを使用しません。データベースレベルでデータを保護する必要があります。

トリガーを作成するときは、トリガーが複数行の挿入/更新/削除を処理できることを確認してください。トリガーは、一度に1行ではなく、データセット全体を操作します。

于 2010-06-08T19:22:48.713 に答える
4

パート1では、個別のトリガーを設定するか、特別なテーブルをチェックして更新と削除を区別するトリガーを1つ持つことができINSERTEDますDELETED

パート2では、この場合、それを回避する方法はありません。Web/ Windowsアプリを介して、何らかの方法でそのユーザー名をデータベースに取得する必要があります。残念ながら、トリガー自体と通信することはできず、一般的な接続文字列を使用すると、DBは誰を処理しているのかわかりません。

監査する予定のテーブルに「LastModifiedBy」列を追加して、元のテーブル自体にその情報を保存できるようにすると便利な場合があることがわかりました。次に、トリガーはその情報を監査テーブルにコピーするだけです。これは、最後に誰かに触れたのが誰であるかを知る必要があるだけで、監査テーブルをまったく調べる必要がない場合は、その1つの列を確認するだけでよいので便利です。

于 2010-06-08T17:31:48.813 に答える
3

roufamaticが言ったように、各アクションに固有のトリガーを設定するか、INSERTEDテーブルとDELETEDテーブルをチェックすることができます。

削除するユーザーについては、アプリケーションのコードが処理する限り、その情報をトリガーに渡すことができます。私は約1年前にクライアントでこの要件に遭遇しました。私が思いついた解決策は、SET CONTEXT_INFOとCONTEXT_INFO()を使用してユーザー名を渡すことでした。すべてのデータベースアクセスはストアドプロシージャを介して行われたため、ストアドプロシージャの削除に1行か2行のコードを追加して、SET CONTEXT_INFOに追加し、削除トリガーを変更してユーザーをCONTEXT_INFO()から取得しました。もちろん、ユーザー名はアプリケーションからパラメーターとして渡される必要がありました。ストアドプロシージャを使用していない場合は、アプリケーションでSETCONTEXT_INFOを実行できる可能性があります。接続プールがそのメソッドにどのように影響するかわかりません。明らかに、

CONTEXT_INFOはバイナリ文字列であるため、少し注意が必要でしたが、すべてを整理するのにそれほど時間はかかりませんでした。

過去のクライアント用だったので、便利なコードがないのではないかと思います。CONTEXT_INFOとSETCONTEXT_INFOのヘルプを実行した後で問題が発生した場合は、ここに投稿してください。覚えていることを確認します。

于 2010-06-08T17:47:00.910 に答える
1

実行されているアクションを確認するには、INSERTEDテーブルとDELETEDテーブルを使用して、前後の値を比較します。Webアプリのどのユーザーが変更を加えたかを知る魔法の方法はありません。通常の方法は、テーブルに変更された列を設定し、Webアプリコードに関連するユーザー名を入力することです。

于 2010-06-08T17:31:20.657 に答える