背景情報:
- アプリの一連のデータテーブルに対する更新と削除を追跡するために、監査テーブルのコレクションを作成しています。
- 監査レコードはトリガーを介して作成されます。
- アプリのデータベースのDMLは通常、サービスがデータベースにアクセスするために使用するログインから取得されます。このため
SYSTEM_USER
、トリガーで呼び出されたときの結果は常に同じになると思います。 - 私のアプリは現在ユーザーデータを保存していませんが、
UserId
DMLが実行されるたびに文字列が与えられます(ストアドプロシージャでのみ行われます)。
私が遭遇した問題は、ユーザーがレコードを削除するときに、誰がそれをしたのか知りたいということです。同じログインによって行われるため、すべてのアクションがサービスによって行われたことを確認したくありません。どのユーザーがそれを実行したかを確認したいと思います。ModifiedBy
更新の送信で更新される列があるため、これは更新の問題ではありませんUserId
。
問題はSYSTEM_USER
、削除が実行されたときに、ユーザー情報をトリガーに設定する方法、またはトリガーに取得する方法はありますか?
私が現在持っている「最高の」アイデアは、それが良いアイデアかどうかはまだわかりませんが、サービスで、現在のものUserId
がデータベースとしてユーザーに存在するかどうかを確認し、そうでない場合はユーザーを作成することです彼らのためのオブジェクト。次に、でストアドプロシージャを実行しEXECUTE AS User = @UserId
ます。次に、ストアドプロシージャでDMLが実行され、トリガーが起動すると、SYSTEM_USER
からユーザーを返す必要がありEXECUTE AS
ます。