Sql-Server

使用共享登錄時,如何知道使用者對審計表執行刪除操作?

  • September 19, 2013

背景資料:

  • 我正在創建一組審計表,以跟踪對我的應用程序的一組數據表的更新和刪除。
  • 審計記錄是通過觸發器創建的。
  • 我的應用程序數據庫中的 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 用於一次以上的事情。

引用自:https://dba.stackexchange.com/questions/50103