Sql server 确定登录是否映射到特定数据库

Sql server 确定登录是否映射到特定数据库,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我是SQLServer2008的新手,所以如果这在一开始没有意义,我将尝试进行编辑并澄清 问题: 我试图编写一个查询,检索当前映射到指定数据库的所有登录名的列表 我尝试过的: 我正在编写一个应用程序,其中列出了所有主登录名、它们拥有的权限以及它们是否映射到我指定的数据库。我使用sys.server\u permissions表列出了他们的权限。我发现sys.server\u principals显示登录名的默认数据库名称。但是,它不显示登录映射到的数据库 可以在sys.database\u pr

我是SQLServer2008的新手,所以如果这在一开始没有意义,我将尝试进行编辑并澄清

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

我尝试过的:
我正在编写一个应用程序,其中列出了所有主登录名、它们拥有的权限以及它们是否映射到我指定的数据库。我使用
sys.server\u permissions
表列出了他们的权限。我发现
sys.server\u principals
显示登录名的默认数据库名称。但是,它不显示登录映射到的数据库

可以在
sys.database\u principals
中找到数据库用户。这将显示数据库用户及其映射到的登录名

SELECT *
FROM sys.server_principals sp
INNER JOIN [your database].sys.database_principals dp
    ON sp.sid = dp.sid
数据库权限存储在
sys.Database\u permissions
中。角色也是原则。您可以在
sys.database\u role\u 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
数据库
开头的表/视图从当前数据库上下文返回数据


编辑:修复了“principals”的拼写问题。

您需要一组表来完成此操作-从以下内容开始:

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] 

摘自

谢谢。第一段代码完美地显示了映射到我的数据库的每个登录名。在主登录生成查询中,我使用了与sys.database\u主体的完整外部联接。