我不清楚 SQL Server 2005 或 2008 中与安全相关的目录视图。我想在一个查询中列出所有登录名、他们的服务器角色、他们在所有数据库中的对应用户、所有数据库角色。我该如何编写查询?
我知道有一些目录视图可供使用,但我不熟悉它们的关系。这些目录视图包括:sys.database_role_member、sys.database_principals、sys.server_role_member、sys.server_principals。
谢谢。
我不清楚 SQL Server 2005 或 2008 中与安全相关的目录视图。我想在一个查询中列出所有登录名、他们的服务器角色、他们在所有数据库中的对应用户、所有数据库角色。我该如何编写查询?
我知道有一些目录视图可供使用,但我不熟悉它们的关系。这些目录视图包括:sys.database_role_member、sys.database_principals、sys.server_role_member、sys.server_principals。
谢谢。
您不能有一个查询列出所有数据库,因为该列表是动态的。你最好的选择是使用sp_msforeachdb并有一个批处理构造结果并返回它:
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