如何编写SQL查询以找出在Sql Server 2005中已授予哪些登录名哪些权限?

时间:2020-03-05 18:54:21  来源:igfitidea点击:

我负责一些测试数据库服务器。从历史上看,有太多其他人可以接触到他们。它们在SQL Server 2005上运行。我一直在编写查询并将其包装在脚本中,以便我可以对权限进行定期审核。找出哪些用户具有服务器本身的管理员权限就很好了,就像找出谁在其登录名上具有" sysadmin"角色一样,对后者进行单行查询。

但是,如何找出哪些登录将用户映射到特定(或者任何)数据库?我可以找到sys.database_principals表和sys.server_principals表。我已经找到sys.databases表。我还没有找到如何找出哪些用户对数据库拥有权限的信息,如果有的话,还算什么。每次Google搜索都使用"登录"对话框的"用户映射"窗格来手动调动人员,而不是使用查询来调动人员。有任何想法吗?

解决方案

回答

select * from Master.dbo.syslogins l inner join sys.sysusers u on l.sid = u.sid

这将为我们提供将哪些用户映射到单个数据库中的哪些登录名。

回答

查阅有关Has_Perms_By_Name的此msdn参考文章。我认为我们对示例D,F和G真的很感兴趣

另一个想法...我启动了SQL事件探查器,然后单击ObjectExplorer-> Security-> Users。这导致发出(大约)以下查询。

SELECT *
FROM
  sys.database_principals AS u
  LEFT OUTER JOIN sys.database_permissions AS dp
  ON dp.grantee_principal_id = u.principal_id and dp.type = N'CO'
WHERE (u.type in ('U', 'S', 'G', 'C', 'K'))
ORDER BY [Name] ASC

回答

这是这样做的方法。我最终在MSDN文档中找到对存储过程的引用。我从存储过程中取出了该文件,并将其包装到实例已知的所有数据库的循环中。

select DbRole = g.name, MemberName = u.name
  from @NAME.sys.database_principals u, @NAME.sys.database_principals g, @NAME.sys.database_role_members m
  where   g.principal_id = m.role_principal_id
    and u.principal_id = m.member_principal_id
    and g.name in (''db_ddladmin'', ''db_owner'', ''db_securityadmin'') 
    and u.name not in (''dbo'')
  order by 1, 2

然后,报告那些可能不应该拥有DBO的用户。我已经撤消了某些不需要的用户的管理员访问权限。谢谢大家!