SQL Server的安全主體主要分為Login、User和Role,不僅有ID屬性,還有Name屬性和SID屬性,SID是指Security ID。
一,查看數據庫用戶
數據庫主體,可以從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的名稱。
對於CURRENT_USER
返回當前安全上下文User Name,該函數等價於USER_NAME()函數。
CURRENT_USER
比如,sysadmin 服務器角色的成員,其CURRENT_USER就是dbo。如果登錄的用戶是domain\user1,屬於domain\group1的成員,通過group1的權限來訪問數據庫,那么CURRENT_USER返回的Windows 主體的名稱是domain\user1。
對於USER_NAME()函數
參數id是int類型,通過用戶id來返回用戶的name,如果省略參數,返回當前用戶的name。
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' ] )
參考文檔: