考慮一下這個T-SQL:SQL Server用戶名功能
CREATE USER my_test_user WITHOUT LOGIN;
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
EXECUTE AS USER = 'my_test_user' WITH NO REVERT;
SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
我期待在使用這些帳戶WITHOUT LOGIN
爲審計目的。基本上,我的「獲取數據庫連接」的代碼返回其上EXECUTE AS USER...WITH NO REVERT
已經執行的連接。
的問題是,我不能從任何一個用戶名的功能得到一致的結果。輸出的兩行:
dbo dbo original_user original_user original_user my_test_user my_test_user S-1-9-3-XXXXX.. S-1-9-3-XXXXX.. S-1-9-3-XXXXX..
的USER
功能產生'EXECUTE AS'
後正確的輸出,但事先他們展示,而不是用戶名DBO 的SUSER
功能則正好相反 - 他們是正確的最初但在模仿之後,他們顯示某種ID
SUSER_SNAME的MSDN文檔明確給出了一個應該工作的例子。
更新:我在尋找的是一個函數,它將在第一種情況下產生'original_user',在第二種情況下產生'my_test_user'。
MSDN的例子用途EXECUTE AS LOGIN,這是你在做什麼很大的不同。您必須**完全理解模擬範圍和身份驗證器的概念才能使用EXECUTE AS,特別是按照您的計劃採用侵略性方式。閱讀http://msdn.microsoft.com/en-us/library/ms188304.aspx –