MSSQL:列出几个数据库中每个用户的数据库成员角色

问题描述

我有几个数据库,所有数据库都在database / security / users文件夹下(在图片的左侧显示):

image displaying the membership roles I am looking for

我需要一个查询,该查询可以列出每个用户的角色成员身份(如上图右侧所示,当前用户,称为User2,没有任何用户)。 这些是我要为每个用户列出的角色。

这是我之前使用过的类似内容,用于不同的目的(在/ Security / Logins文件夹下列出登录的服务器角色,而不是在DatabaseName / Security / Users文件夹下列出用户的成员身份):

SELECT
    spU.name,MAX(CASE WHEN srm.role_principal_id = 3 THEN 1 END) AS sysadmin,MAX(CASE WHEN srm.role_principal_id = 4 THEN 1 END) AS securityadmin,MAX(CASE WHEN srm.role_principal_id = 5 THEN 1 END) AS serveradmin,MAX(CASE WHEN srm.role_principal_id = 6 THEN 1 END) AS setupadmin,MAX(CASE WHEN srm.role_principal_id = 7 THEN 1 END) AS processadmin,MAX(CASE WHEN srm.role_principal_id = 8 THEN 1 END) AS diskadmin,MAX(CASE WHEN srm.role_principal_id = 9 THEN 1 END) AS dbcreator,MAX(CASE WHEN srm.role_principal_id = 10 THEN 1 END) AS bulkadmin
FROM
    sys.server_principals AS spR
JOIN
    sys.server_role_members AS srm
ON
    spR.principal_id = srm.role_principal_id
JOIN
    sys.server_principals AS spU
ON
    srm.member_principal_id = spU.principal_id
WHERE
    spR.[type] = 'R'
    and spU.name not like '##MS%'
    and spU.name not like 'NT%'
GROUP BY
    spU.name

这些不是我想要的角色,此处只是为了使您更容易理解我希望输出的格式是什么。 无论如何,该查询输出看起来像这样:

enter image description here

对于我当前的任务(在数据库/安全性/用户/文件夹下列出每个用户的成员角色)的类似输出将是不错的选择,但是欢迎使用其他任何方法来列出成员角色。

对于当前数据库中每个用户的成员角色列表查询,我想使其在多个数据库上工作,这将在sp_MSforeachdb的帮助下完成。当我设法解决该帖子时,我将对其进行编辑。

解决方法

如果有人需要的话,此ID是最终有效的代码:

EXEC sp_MSforeachdb '
IF ''?'' NOT IN (''master'',''msdb'',''tempdb'',''model'')
BEGIN
USE [?]
SELECT
    spU.name,MAX(CASE WHEN srm.role_principal_id = 16384 THEN 1 END) AS db_owner,MAX(CASE WHEN srm.role_principal_id = 16385 THEN 1 END) AS db_accessadmin,MAX(CASE WHEN srm.role_principal_id = 16386 THEN 1 END) AS db_securityadmin,MAX(CASE WHEN srm.role_principal_id = 16387 THEN 1 END) AS db_dlladmin,MAX(CASE WHEN srm.role_principal_id = 16389 THEN 1 END) AS db_backupoperator,MAX(CASE WHEN srm.role_principal_id = 16390 THEN 1 END) AS db_datareader,MAX(CASE WHEN srm.role_principal_id = 16391 THEN 1 END) AS db_datawriter,MAX(CASE WHEN srm.role_principal_id = 16392 THEN 1 END) AS db_denydatareader,MAX(CASE WHEN srm.role_principal_id = 16393 THEN 1 END) AS db_denydatawriter
FROM
    [?].sys.database_principals AS spR
JOIN
    [?].sys.database_role_members AS srm
ON
    spR.principal_id = srm.role_principal_id
JOIN
    [?].sys.database_principals AS spU
ON
    srm.member_principal_id = spU.principal_id
GROUP BY
    spU.name
 
END'

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...