【发布时间】:2009-01-30 21:28:01
【问题描述】:
我正在使用 SQL Server 2005,我想了解所有表在特定数据库上的所有授权。它还有助于找出已为特定用户授予删除权限的所有表。
注意:这可能类似于this question,但我无法使所选答案的解决方案起作用(如果有人可以提供一个更好的示例来说明如何使用它,那也会有所帮助)
【问题讨论】:
标签: sql sql-server-2005 permissions
我正在使用 SQL Server 2005,我想了解所有表在特定数据库上的所有授权。它还有助于找出已为特定用户授予删除权限的所有表。
注意:这可能类似于this question,但我无法使所选答案的解决方案起作用(如果有人可以提供一个更好的示例来说明如何使用它,那也会有所帮助)
【问题讨论】:
标签: sql sql-server-2005 permissions
给定的解决方案不包括对架构或数据库本身授予权限的位置,它们也对表授予权限。这也会给你这些情况。您可以对 permission_name 使用 WHERE 子句来限制为 DELETE。
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 或其派生词中。
【讨论】:
我喜欢 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
【讨论】:
要列出所有可以控制的权限,您可以使用函数fn_my_permission。此查询列出了 服务器 上的所有权限:
select * from fn_my_permissions(NULL, NULL)
您必须使用具有系统管理员角色的帐户登录。
您可以使用以下参数优化函数调用。
对于数据库的所有权限:
select * from fn_my_permissions(NULL, 'database')
对于 dbo 架构的所有权限:
select * from fn_my_permissions('dbo', 'schema')
对于表的所有权限:
select * from fn_my_permissions('dbo.test', 'object')
【讨论】:
要查看特定数据库的所有授权,请使用以下命令:
Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES
要查看特定数据库的删除授权,请使用:
Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE PRIVILEGE_TYPE = 'DELETE'
【讨论】:
要查看整个数据库的授权,请选择有问题的数据库,打开一个新的查询窗口,输入 - sp_helprotect,执行查询
【讨论】: