我是SQL Server 2008的新手,所以如果一開始沒有意義,我會嘗試在澄清的情況下進行編輯。確定登錄是否映射到特定的數據庫
問題: 我想寫檢索當前映射到指定的數據庫中所有登錄的列表查詢。
我曾嘗試: 我寫信,列出了所有主登錄的應用程序,他們所擁有的權限,如果它們被映射到我的指定的數據庫。我已使用sys.server_permissions
表格列出了他們的權限。我發現sys.server_principals
顯示了登錄的默認數據庫名稱。但是,它不顯示登錄映射到的數據庫。
我是SQL Server 2008的新手,所以如果一開始沒有意義,我會嘗試在澄清的情況下進行編輯。確定登錄是否映射到特定的數據庫
問題: 我想寫檢索當前映射到指定的數據庫中所有登錄的列表查詢。
我曾嘗試: 我寫信,列出了所有主登錄的應用程序,他們所擁有的權限,如果它們被映射到我的指定的數據庫。我已使用sys.server_permissions
表格列出了他們的權限。我發現sys.server_principals
顯示了登錄的默認數據庫名稱。但是,它不顯示登錄映射到的數據庫。
數據庫用戶可在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_
開頭的表/視圖從當前數據庫上下文返回數據。
編輯: 「校長」
的固定拼寫你需要一堆表,這樣做 - 開始與此:
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
採取謝謝。第一塊代碼完美地顯示每個映射到我的數據庫的登錄。在我的主登錄生成查詢中,我使用了一個完整的外連接和'sys.database_principals'。 – 2015-04-02 15:28:38