2008-09-15 63 views
2

我负责一些测试数据库服务器。从历史上看,太多的其他人可以访问他们。他们在SQL Server 2005上运行。我一直在编写查询并将它们封装在脚本中,以便我可以定期对权限进行审计。找出哪些用户对服务器本身具有管理员权限是没有问题的,因为发现谁在登录时拥有“sysadmin”角色 - 这是后者的单行查询。如何编写SQL查询以查明哪些登录已被授予Sql Server 2005中的哪些权限?

但如何找出哪些登录有用户映射到特定的(或任何)数据库?我可以找到sys.database_principals和sys.server_principals表。我找到了sys.databases表。我还没有弄清楚如何找出哪些用户对数据库有权限,如果是这样的话,是什么。每个Google搜索都会使用“登录”对话框的“用户映射”窗格手动启动人员,而不是使用查询来执行此操作。有任何想法吗?

回答

1

以下是如何操作。我最终在MSDN文档中找到了对sproc的引用。我把它从sproc中拉出来,并将其包装在实例已知的所有数据库的循环中。

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的用户,他们可能不应该这样做。我已经撤销了一些他们不需要的用户的一些管理员权限。感谢大家!

1

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

这会让你知道用户映射到单个数据库中的哪些登录。

2

查看关于Has_Perms_By_Name的msdn参考文章。我认为你是例子d,F和G


另一个想法很感兴趣......我发射了SQL事件探查器,并点击了ObjectExplorer->安全 - >用户。这导致(大约)发出以下查询。

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 
+0

大卫,我认为你在钱上。我明天开始工作时需要测试一下。将更新这个问题。非常感谢! – 2008-09-15 20:42:33

相关问题