我正在使用SQL Server 2005,我想知道所有表的特定数据库上的所有授权。它还有助于找出为特定用户提供删除授权的所有表。
注意:这可能与this question类似,但我无法让所选答案的解决方案正常工作(如果有人可以提供更好的例子来说明如何使用它,那么它也会有所帮助)
答案 0 :(得分:17)
给定的解决方案不包括针对架构或数据库本身授予权限的位置,该架构也会对表授予权限。这也会给你这些情况。您可以对permission_name使用WHERE子句限制为仅删除。
SELECT
class_desc
, CASE WHEN class = 0 THEN DB_NAME()
WHEN class = 1 THEN OBJECT_NAME(major_id)
WHEN class = 3 THEN SCHEMA_NAME(major_id) END [Securable]
, USER_NAME(grantee_principal_id) [User]
, permission_name
, state_desc
FROM sys.database_permissions
此外,需要检查db_datawriter的成员资格,因为它提供了隐含的INSERT,UPDATE和DELETE权限,这意味着您不会在权限DMV或其衍生产品中看到它。
答案 1 :(得分:5)
要列出可以控制的所有权限,您可以使用函数fn_my_permission
。此查询列出了服务器:
select * from fn_my_permissions(NULL, NULL)
您必须使用具有sysadmin角色的帐户登录。
您可以使用以下参数优化函数调用。
对于数据库的所有权限:
select * from fn_my_permissions(NULL, 'database')
对于dbo 架构的所有权限:
select * from fn_my_permissions('dbo', 'schema')
对于表的所有权限:
select * from fn_my_permissions('dbo.test', 'object')
答案 2 :(得分:4)
要查看特定数据库的所有授权,请使用以下命令:
Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES
要查看特定数据库上的删除授权,请使用以下命令:
Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE PRIVILEGE_TYPE = 'DELETE'
答案 3 :(得分:4)
我喜欢K. Brian Kelly的答案,但我想要更多信息(比如架构)以及生成相应的GRANT和REVOKE语句,以便我可以在不同的环境中应用它们(例如dev / test / prod)
请注意,您可以轻松排除系统对象,请参阅注释where子句
select
class_desc
,USER_NAME(grantee_principal_id) as user_or_role
,CASE WHEN class = 0 THEN DB_NAME()
WHEN class = 1 THEN ISNULL(SCHEMA_NAME(o.uid)+'.','')+OBJECT_NAME(major_id)
WHEN class = 3 THEN SCHEMA_NAME(major_id) END [Securable]
,permission_name
,state_desc
,'revoke ' + permission_name + ' on ' +
isnull(schema_name(o.uid)+'.','')+OBJECT_NAME(major_id)+ ' from [' +
USER_NAME(grantee_principal_id) + ']' as 'revokeStatement'
,'grant ' + permission_name + ' on ' +
isnull(schema_name(o.uid)+'.','')+OBJECT_NAME(major_id)+ ' to ' +
USER_NAME(grantee_principal_id) + ']' as 'grantStatement'
FROM sys.database_permissions dp
LEFT OUTER JOIN sysobjects o
ON o.id = dp.major_id
-- where major_id >= 1 -- ignore sysobjects
order by
class_desc desc
,USER_NAME(grantee_principal_id)
,CASE WHEN class = 0 THEN DB_NAME()
WHEN class = 1 THEN isnull(schema_name(o.uid)+'.','')+OBJECT_NAME(major_id)
WHEN class = 3 THEN SCHEMA_NAME(major_id) end
,permission_name
答案 4 :(得分:2)
要查看整个数据库的授权,请选择有问题的数据库,打开新的查询窗口,输入 - sp_helprotect
,执行查询