我有一个我继承的旧数据库。访问权限在任何地方都没有明确定义,我正在寻找一种快速的方法来为每个人提供这些权限。假设我的数据库中有一个不属于任何成员角色的用户。但是,他们可以访问特定表格的特定内容。例如,他们可以在表X上运行选择查询并在表Y上运行更新查询。我知道我可以通过转到每个用户的属性来找出它们的内容。但是,我想,必须有一个系统表,其中包含所有这些,并使其易于查询。这个查询会是什么样的。
仅供参考:我正在使用SQL Server 2005
更新:是否还有一种方法可以对服务器上的所有数据库执行此操作?
答案 0 :(得分:5)
查看Security Catalog Views,然后查看MrDenny的回答here,其中提供了查询以列出用户的权利。我在这里重现它(整理了我的喜好)..
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
答案 1 :(得分:3)
实际上事情有点棘手。有效权限是内部数据库权限(可通过doza上面显示的Denny查询查询)和窗口组成员身份的组合。遗憾的是,后来存储在SQL之外的AD模式中,因此您无法对其进行查询。
因此,如果您的目标是显示'对表的访问权限给予域\ someuser和domain \ somegroup并拒绝域\ someothergroup',那么您可以使用目录元数据并查询它,如doza的帖子所示。
但是,如果您的目标是回答'用户域\某些用户是否可以访问表X?'你无法从上面的查询中得到答案。这是正确的,尽管你看到一条记录说域名/某些用户被授予访问权限,但如果具有有效访问权限,则无法回答。请记住,单个deny胜过所有授权,如果domain \ user是domain \ someothergroup group的成员,则domain \ someuser实际上是被拒绝访问。
要回答后面的问题,您必须使用不同的机制,即您必须在SQL级别模拟用户并通过HAS_PERM_BY_NAME检查权限:
EXECUTE AS USER = 'domain\someuser';
SELECT HAS_PERMS_BY_NAME('X','TABLE','SELECT');
REVERT;
值得注意的是,任何对安全目录具有查看权限的人都可以回答第一个问题,而后者需要模拟权限,这是一个更强大的权限。