用戶和登陸的ID、Name和SID

SQL Server的安全主體主要分爲Login、User和Role,不只有ID屬性,還有Name屬性和SID屬性,SID是指Security ID。在查看用戶和登陸的時候,受到模擬上下文的影響。當執行EXECUTE AS命令,切換上下文以後,除了ORIGINAL_LOGIN以外,其餘函數都會返回模擬上下文的Login和User信息。sql

一,查看數據庫用戶

數據庫主體,能夠從sys.database_principals中查看,不只包含User,還包括數據庫角色(DATABASE_ROLE)。每個user不只有ID屬性,還有Name屬性和SID屬性。數據庫

 數據庫用戶是指在特定的數據庫中建立的用戶,分爲SQL_USER、WINDOWS_USER和WINDOWS_GROUP三種類型。用戶的Name屬性,是指數據庫主體的name屬性,用戶的ID屬性,是指數據庫主體的principal_id屬性。安全

1,查看數據庫用戶的name服務器

查看數據庫用戶的name,使用CURRENT_USER 和 USER_NAME()。若是用戶使用EXECUTE AS命令切換上下文,那麼CURRENT_USER和 USER_NAME() 返回模擬上下文的用戶的Name。若是用戶經過Windows 驗證返回數據庫,而且是Windows Group的成員,那麼CURRENT_USER和 USER_NAME()返回Windows主體的名稱,而不是Group的名稱。dom

對於CURRENT_USER函數

返回當前安全上下文User Name,該函數等價於USER_NAME()函數。spa

CURRENT_USER

好比,sysadmin 服務器角色的成員,其CURRENT_USER就是dbo。若是登陸的用戶是domain\user1,屬於domain\group1的成員,經過group1的權限來訪問數據庫,那麼CURRENT_USER返回的Windows 主體的名稱是domain\user1。code

對於USER_NAME()函數server

參數id是int類型,經過用戶id來返回用戶的name,若是省略參數,返回當前用戶的name。blog

USER_NAME ( [ id ] )

對於USER

USER和 USER_NAME()函數的功能相同。

USER  

2,查看數據庫用戶的ID

經過用戶的name來查看用戶的ID:

USER_ID ( [ 'user' ] )

用戶和角色都屬於數據庫主體,也能夠經過DATABASE_PRINCIPAL_ID()來查看用戶的ID:

DATABASE_PRINCIPAL_ID ( 'principal_name' )  

二,查看服務器登陸

Login(登陸)是服務器主體(Server Principal),除了Login以外,服務器主體還包括SERVER_ROLE。

從sys.server_principals中查看Login的屬性,Login分爲三個類型:SQL_LOGIN、WINDOWS_LOGIN和WINDOWS_GROUP。

 每一個Login都有Name屬性、ID屬性和一個安全標識(SID)。Login ID是指服務器主體的 principal_id屬性,Login Name是指服務器主體的name屬性。

1,查看Login的Name屬性

經過SYSTEM_USER返回當前Login的名稱:

SYSTEM_USER  

經過SUSER_NAME()函數返回指定Login ID的名稱,參數是Login ID(principal_id):

SUSER_NAME ( [ server_user_id ] ) 

若是省略參數server_user_id,那麼返回當前Login的名稱。

2,查看Login的ID屬性

經過Login的Name來查看Login的ID屬性:

SUSER_ID ( [ 'login' ] ) 

三,SID和ID

當建立一個Login(SQL Login 或 Windows Login)時,系統會自動建立Login的 ID 和 SID,從sys.server_principals 系統視圖中,看到該Login對應一個ID和SID。在SQL Server實例中,ID和SID都是惟一的,不一樣之處是,ID標識Login,將Login做爲一個安全主體,SID標識Login的安全上下文(Security Context)。通常來講,ID能夠重用,可是SID通常是不會重用的。當同一個Login重複建立時,其Login ID可能發生變化,可是其SID不變。

不只Login有ID和SID,Database User也有。當建立一個數據庫user時,從sys.database_principals中,可以看到該User被指定一個ID和SID。在數據庫級別,User的ID是惟一的。

在建立User時,須要把User和Login映射起來,這就使得User和Login具備相同的SID屬性。關於SID和ID的詳細信息,請閱讀《SIDs and IDs

 

經過Login的Name查看SID:

SUSER_SID ( [ 'login' ] [ , Param2 ] )  

經過SID查看Login的Name屬性:

SUSER_SNAME ( [ server_user_sid ] )

四,檢查成員關係

檢查某一個用戶或Login是否屬於Windows Group或Role(Database Role 或 Server Role)的成員。

1,檢查當前用戶是否是Windows Group和 Database Role的成員:

IS_MEMBER ( { 'group' | 'role' } )  

2,檢查指定的數據庫主體是否是Database Role的成員

IS_ROLEMEMBER ( 'role' [ , 'database_principal' ] ) 

3,檢查Login是否是Server Role的成員

IS_SRVROLEMEMBER ( 'role' [ , 'login' ] ) 

五,模擬上下文和原始上下文

當執行EXECUTE AS 命令以後,用戶的安全上下文會被切換爲指定的用戶。ORIGINAL_LOGIN() 返回最原始的Login名稱,不受上下文切換的影響:

ORIGINAL_LOGIN( ) 

其餘返回用戶和Login的函數,都是基於當前上下文的。

好比,SESSION_USER返回當前安全上下文的用戶名稱,若是該函數在EXECUTE AS 命令以後被調用,那麼上下文被切換,SESSION_USER返回模擬上下文的用戶名稱:

SESSION_USER 

 

參考文檔:

Security Functions (Transact-SQL) 

相關文章
相關標籤/搜索