Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何查询特定的用户访问权限_Sql Server_Sql Server 2005_Access Control - Fatal编程技术网

Sql server 如何查询特定的用户访问权限

Sql server 如何查询特定的用户访问权限,sql-server,sql-server-2005,access-control,Sql Server,Sql Server 2005,Access Control,我有一个我正在继承的旧数据库。访问权限在任何地方都没有明确的定义,我正在寻找一种快速的方法让每个人都能获得这些权限。假设我的数据库中有一个用户不属于任何成员角色。但是,他们可以访问特定的表执行特定的操作。例如,他们可以在表X上运行select查询,在表Y上运行update查询。我知道我可以通过转到每个用户的属性来找出他们有什么。然而,我可以想象,在某个地方必须有一个系统表,其中定义了所有这些,并使其易于查询。这个查询是什么样子的 仅供参考:我正在使用SQL Server 2005 更新:服务器上

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

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

更新:服务器上的所有数据库也有这样做的方法吗?

请查看,然后查看Denny先生的答案,该答案提供了一个查询以列出用户权限。我在这里复制它(整理到我喜欢的程度)


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

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

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

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

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

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
EXECUTE AS USER = 'domain\someuser';
SELECT HAS_PERMS_BY_NAME('X','TABLE','SELECT');
REVERT;