查看特定登录名的属性时,可以看到映射到该登录名的用户列表:
我分析了 SQL Server Management Studio (SSMS),发现 SSMS 一次连接到每个数据库,并从 sys.database_permissions 检索信息
是否可以编写单个查询来检索上面显示的用户映射信息,或者我是否被迫使用游标或 sp_MSforeachdb 或类似的东西?
查看特定登录名的属性时,可以看到映射到该登录名的用户列表:
我分析了 SQL Server Management Studio (SSMS),发现 SSMS 一次连接到每个数据库,并从 sys.database_permissions 检索信息
是否可以编写单个查询来检索上面显示的用户映射信息,或者我是否被迫使用游标或 sp_MSforeachdb 或类似的东西?
这是使用动态 SQL 的一种方法。如果不进行迭代,实际上没有任何方法可以做到这一点,但这种方法比无证、不受支持和有缺陷的选项(例如
sp_MSforeachdb
(此处和此处的背景))安全得多。这将获得所有在线数据库的列表、映射用户(如果存在)、默认模式名称以及它们所属角色的逗号分隔列表。
在更现代的版本(2017+)上,我仍然会使用动态 SQL,但我会使用
STRING_AGG()
而不是FOR XML PATH
,可能是这样的:在后一个示例中,如果您只希望将用户映射到命名登录的数据库,只需将第一个左连接更改为内连接。
这个脚本是从一个提到的脚本稍微修改的,会做你正在寻找的。将“ThursdayClass”替换为您需要信息的登录名。 https://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/
尝试sp_dbpermissions。它可能会给你比你需要的更多的信息,但它会做你想做的事。
一旦它安装运行这个。
公平警告目前它会进行“喜欢”匹配,因此如果其他登录名相似且匹配,那么您也会看到它们。例如
MyLogin
andMyLoginForThis
都将匹配MyLogin
. 如果这是一个问题,我有一个尚未发布的版本,您可以将其关闭。让我知道,我可以通过电子邮件发送给您。遗憾的是,您将不得不遍历所有数据库才能获取信息。您需要加入
sys.database_principals
到sys.server_principals
SID 上匹配的每个数据库。不要使用
sp_msforeachdb
,因为它有时会丢失数据库。这是一个powershell解决方案:
我正在寻找类似的答案,发现:https ://www.pythian.com/blog/httpconsultingblogs-emc-comjamiethomsonarchive20070209sql-server-2005_3a00_-view-all-permissions-_2800_2_2900_-aspx/ 。是的,它使用了可怕的 sp_MSforeachDB,但我认为那个家伙有时会受到不好的说唱...... ;-)
我将在此处发布 SQL 以便轻松复制意大利面(我不为此而功劳,只是让它易于访问!):
下面的 Query 将返回请求的 DbName 的映射
改进的查询如下
怎么样
EXEC master..sp_msloginmappings
?