确定Login是否映射到特定数据库

时间:2015-04-02 14:29:50

标签: sql-server sql-server-2008

我是SQL Server 2008的新手,所以如果一开始没有意义,我会尝试编辑并澄清。

问题: 我正在尝试编写一个查询,该查询检索当前映射到指定数据库的所有登录列表。

我尝试了什么: 我正在编写一个应用程序,列出所有主登录,它们具有什么权限,以及它们是否映射到我指定的数据库。我已使用sys.server_permissions表列出了他们的权限。我发现sys.server_principals显示了Login的默认数据库名称。但是,它不显示Login映射到的数据库。

2 个答案:

答案 0 :(得分: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_开头的表/视图从当前数据库上下文返回数据。

编辑:固定拼写"校长"

答案 1 :(得分: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