Sql-Server
使用共享登錄時,如何知道使用者對審計表執行刪除操作?
背景資料:
- 我正在創建一組審計表,以跟踪對我的應用程序的一組數據表的更新和刪除。
- 審計記錄是通過觸發器創建的。
- 我的應用程序數據庫中的 DML 通常來自服務用於進入數據庫的登錄名。因此,我認為
SYSTEM_USER
在觸發器中呼叫時結果總是相同的。- 我的應用程序目前不儲存使用者數據,儘管
UserId
每次完成 DML 時都會給它一個字元串(僅在儲存過程中完成)。我遇到的問題是,當使用者刪除記錄時,我想知道是誰做的。因為它將通過相同的登錄完成,所以我不想看到所有操作都是由服務完成的,我想看看是哪個使用者完成的。這不是更新的問題,因為我們的
ModifiedBy
列將通過更新發送來UserId
更新。問題是:有沒有辦法在
SYSTEM_USER
執行刪除時設置或以其他方式將使用者資訊放入觸發器中?我現在的“最佳”想法,雖然我不確定這是否是一個好主意,但在服務中我檢查目前
UserId
是否作為使用者在數據庫中,如果沒有創建使用者為他們反對。然後執行儲存過程EXECUTE AS User = @UserId
。然後當 DML 在儲存過程中完成並且觸發器觸發時,SYSTEM_USER
應該從EXECUTE AS
.
雖然使用
EXECUTE AS User = @UserId
可能是您的最佳選擇(取決於其他問題),但這裡有一種替代方法:在您的儲存過程中,或在您
DELETE
執行以下命令之前的 SQL 會話中的任何時候:SET CONTEXT_INFO @UserId
然後在您的觸發器中,您可以使用檢索此值
SELECT @var = CAST(CAST(CONTEXT_INFO() As Varbinary(4)) As Int)
這有一些缺點,其中最重要的是您不能輕易地將 CONTEXT_INFO 用於一次以上的事情。