2015-04-02 50 views
0

我是SQL Server 2008的新手,所以如果一開始沒有意義,我會嘗試在澄清的情況下進行編輯。確定登錄是否映射到特定的數據庫

問題: 我想寫檢索當前映射到指定的數據庫中所有登錄的列表查詢。

我曾嘗試: 我寫信,列出了所有主登錄的應用程序,他們所擁有的權限,如果它們被映射到我的指定的數據庫。我已使用sys.server_permissions表格列出了他們的權限。我發現sys.server_principals顯示了登錄的默認數據庫名稱。但是,它不顯示登錄映射到的數據庫。

回答

1

數據庫用戶可在sys.database_principals中找到。這將向您顯示數據庫用戶及其映射到的登錄名。

SELECT * 
FROM sys.server_principals sp 
INNER JOIN [your database].sys.database_principals dp 
    ON sp.sid = dp.sid 

數據庫權限存儲在sys.database_permissions中。角色也是一個原則。您可以在sys.database_role_members中找到用戶屬於哪個角色。

USE [your database];  
SELECT * 
FROM sys.database_principals usr 
INNER JOIN sys.database_role_members usr_roles 
    ON usr.principal_id = usr_roles.member_principal_id 
INNER JOIN sys.database_principals roles 
    ON usr_roles.role_principal_id = roles.principal_id 

database_開頭的表/視圖從當前數據庫上下文返回數據。

編輯: 「校長」

+0

採取謝謝。第一塊代碼完美地顯示每個映射到我的數據庫的登錄。在我的主登錄生成查詢中,我使用了一個完整的外連接和'sys.database_principals'。 – 2015-04-02 15:28:38

1

的固定拼寫你需要一堆表,這樣做 - 開始與此:

SELECT [UserName] = ulogin.[name], 
[UserType] = CASE princ.[type] 
WHEN 'S' THEN 'SQL User' 
WHEN 'U' THEN 'Windows User' 
WHEN 'G' THEN 'Windows Group' 
END, 
[DatabaseUserName] = princ.[name], 
[Role] = NULL, 
[PermissionState] = perm.[state_desc], 
[PermissionType] = perm.[permission_name], 
[ObjectType] = CASE perm.[class] 
WHEN 1 THEN obj.type_desc -- Schema-contained objects 
ELSE perm.[class_desc] -- Higher-level objects 
END, 
[ObjectName] = CASE perm.[class] 
WHEN 1 THEN OBJECT_NAME(perm.major_id) -- General objects 
WHEN 3 THEN schem.[name] -- Schemas 
WHEN 4 THEN imp.[name] -- Impersonations 
END, 
[ColumnName] = col.[name] 
FROM --database user 
sys.database_principals princ 
LEFT JOIN --Login accounts 
sys.server_principals ulogin 
ON princ.[sid] = ulogin.[sid] 
LEFT JOIN --Permissions 
sys.database_permissions perm 
ON perm.[grantee_principal_id] = princ.[principal_id] 
LEFT JOIN --Table columns 
sys.columns col 
ON col.[object_id] = perm.major_id 
AND col.[column_id] = perm.[minor_id] 
LEFT JOIN sys.objects obj 
ON perm.[major_id] = obj.[object_id] 
LEFT JOIN sys.schemas schem 
ON schem.[schema_id] = perm.[major_id] 
LEFT JOIN sys.database_principals imp 
ON imp.[principal_id] = perm.[major_id] 
WHERE princ.[type] IN ('S', 'U', 'G') 
AND -- No need for these system accounts 
princ.[name] NOT IN ('sys', 'INFORMATION_SCHEMA') 
ORDER BY 
ulogin.[name], 
[UserType], 
[DatabaseUserName], 
[Role], 
[PermissionState], 
[PermissionType], 
[ObjectType], 
[ObjectName], 
[ColumnName] 

http://www.sqlservercentral.com/Forums/Topic886424-359-1.aspx

相關問題