Sql server 2005 在SQLServer2005中,如何编写查询以列出所有登录名、它们的服务器角色、所有数据库中对应的用户、数据库角色?

Sql server 2005 在SQLServer2005中,如何编写查询以列出所有登录名、它们的服务器角色、所有数据库中对应的用户、数据库角色?,sql-server-2005,security,tsql,login-script,Sql Server 2005,Security,Tsql,Login Script,我不清楚SQLServer2005或2008中与安全相关的目录视图。我想在一个查询中列出所有登录名、它们的服务器角色、它们在所有数据库中对应的用户、所有数据库角色。如何编写查询 我知道有一些目录视图可供使用,但我不熟悉它们之间的关系。这些目录视图包括:sys.database\u role\u成员、sys.database\u主体、sys.server\u role\u成员、sys.server\u主体 谢谢。一个查询列表不能列出所有数据库,因为该列表是动态的。最好使用并让批处理构造结果并返回:

我不清楚SQLServer2005或2008中与安全相关的目录视图。我想在一个查询中列出所有登录名、它们的服务器角色、它们在所有数据库中对应的用户、所有数据库角色。如何编写查询

我知道有一些目录视图可供使用,但我不熟悉它们之间的关系。这些目录视图包括:sys.database\u role\u成员、sys.database\u主体、sys.server\u role\u成员、sys.server\u主体


谢谢。

一个查询列表不能列出所有数据库,因为该列表是动态的。最好使用并让批处理构造结果并返回:

set nocount on;
create table  #result (sid varbinary(85), 
 server_principal_id int,
 database_id int,
 database_principal_id int);

exec ms_foreachdb 'insert into #result 
  (server_principal_id, database_id, database_principal_id)
select s.principal_id, 
  db_id(''?''),
  d.principal_id
from sys.server_principals s
join [?].sys.database_principals d
  on s.sid = d.sid;';

select * from #result;

一旦找到一个合适的结果集形状,将所有这些信息聚合到一个表中,您就可以将其扩展为包括服务器角色和数据库角色成员身份。

下面的查询将列出所有登录及其分配的服务器级角色

select 
  login_name = pa.name, 
  --pa.principal_id, m.member_principal_id, m.role_principal_id,pb.principal_id,
  role_name = pb.name
from
  sys.server_principals pa
  inner join
  sys.server_role_members m on pa.principal_id = m.member_principal_id
  inner join
  sys.server_principals pb on m.role_principal_id = pb.principal_id
order by
  pa.name,
  pa.principal_id