2009-10-16 104 views
2

考慮一下這個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'。

+0

MSDN的例子用途EXECUTE AS LOGIN,這是你在做什麼很大的不同。您必須**完全理解模擬範圍和身份驗證器的概念才能使用EXECUTE AS,特別是按照您的計劃採用侵略性方式。閱讀http://msdn.microsoft.com/en-us/library/ms188304.aspx –

回答

4

更新:你需要在這裏ORIGINAL_LOGIN FN太

原文:

之後,沒有匹配的系統級用戶。因此,它不能解析數據庫級的SID,所以單純從sys.database_principals

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(), 
         SUSER_SID(); 

SELECT * FROM sys.database_principals WHERE sid = SUSER_SID(); 

我不知道這是由設計返回SID,但它說明了其中的數字從何而來。不出所料,其餘低於

Notes作爲解釋:

  • 你會得到USER_NAME(),因爲你用系統管理員權限登錄DBO。使用db級用戶功能時,每個使用「sysadmin」的用戶都是dbo。

  • 改變用戶上下文後,分貝級用戶功能解析到數據庫用戶上下文

  • 對於系統級用戶的功能,你會得到你所使用的登錄前

0

這裏只是一個猜測,但在我看來,第一個選擇正在以當前登錄的用戶的身份運行,並且在第二個選擇中,然後告訴sql server執行爲新創建的用戶。

+0

是的,正好....所以什麼函數將返回第一種情況下的'original_user'和第二種情況下'my_test_user'? – Clyde

1

沒有登錄用戶都被專門用於服務代理安全性(遠程服務綁定)或用於代碼簽名的一個特例。他們代表身份,而不是模仿。不要使用未經EXECUTE AS登錄的用戶。你會碰到的所有排序的邊緣情況,因爲他們明確地沒有一個用戶登錄映射和幾乎無處不在的映射預期。