4

我有一个要继承的旧数据库。访问权限在任何地方都没有明确定义,我正在寻找一种快速的方法来为每个人获取它们。假设我的数据库中有一个不属于任何成员角色的用户。但是,他们已被授予对特定表执行特定操作的权限。例如,他们可以在表 X 上运行选择查询并在表 Y 上运行更新查询。我知道我可以通过转到每个用户的属性来找出他们有什么。但是,我可以想象,某处必须有一个系统表,其中定义了所有这些并使其易于查询。这个查询会是什么样子。

仅供参考:我正在使用 SQL Server 2005

更新:还有一种方法可以对服务器上的所有数据库执行此操作吗?

4

2 回答 2

5

查看Security Catalog Views ,然后在此处查看 MrDenny 的答案,该答案提供了一个查询以列出用户的权限。我在这里复制它(根据我的喜好整理)..

SELECT  [Schema]            =   sys.schemas.name 
,       [Object]            =   sys.objects.name 
,       username            =   sys.database_principals.name 
,       permissions_type    =   sys.database_permissions.type 
,       permission_name     =   sys.database_permissions.permission_name
,       permission_state    =   sys.database_permissions.state 
,       state_desc          =   sys.database_permissions.state_desc
,       permissionsql       =   state_desc + ' ' + permission_name 
                                 + ' on ['+ sys.schemas.name + '].[' + sys.objects.name 
                                 + '] to [' + sys.database_principals.name + ']' 
                                  COLLATE LATIN1_General_CI_AS 
FROM sys.database_permissions 
 INNER JOIN sys.objects ON sys.database_permissions.major_id =      sys.objects.object_id 
 INNER JOIN sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id 
 INNER JOIN sys.database_principals ON sys.database_permissions.grantee_principal_id =  sys.database_principals.principal_id 
ORDER BY 1, 2, 3, 5
于 2009-12-18T14:46:15.637 回答
3

事情实际上有点棘手。有效权限是内部数据库权限(如上面 doza 显示的 Denny 查询)windows 组成员资格的组合。不幸的是,稍后存储在 SQL 之外,在 AD 模式中,因此您无法真正查询它。

因此,如果您的目标是显示“域\someuser 和域\somegroup 对表 X 的访问权,而域\someothergroup 拒绝访问表 X”,那么您可以使用目录元数据并查询它,如 doza 的帖子所示。

但是,如果您的目标是回答“用户域\某些用户是否有权访问表 X?” 您无法从上面的查询中得到答案。没错,尽管您看到一条记录说域\某些用户被授予访问权限,但您无法回答它是否具有有效访问权限。请记住,单个拒绝胜过所有授权,如果 domain\user 是 domain\someothergroup 组的成员,则 domain\someuser 被有效地拒绝访问。

要回答后面的问题,您必须使用不同的机制,即您必须在 SQL 级别模拟用户并通过HAS_PERM_BY_NAME检查权限:

EXECUTE AS USER = 'domain\someuser';
SELECT HAS_PERMS_BY_NAME('X','TABLE','SELECT');
REVERT;

值得注意的是,任何对安全目录具有查看权限的人都可以回答第一个问题,而后者则需要模拟权限,这是一个更强大的权限。

于 2009-12-18T15:57:30.140 回答