Joe*_*ggs 16 sql permissions sql-server-2005
我正在使用SQL Server 2005,我想知道所有表的特定数据库上的所有授权.它还有助于找出为特定用户提供删除授权的所有表.
注意:这可能与此问题类似,但我无法让选定答案的解决方案正常工作(如果有人可以提供更好的示例,如何使用它,它也会有帮助)
K. *_*ley 20
给定的解决方案不包括针对架构或数据库本身授予权限的位置,该架构也会对表授予权限.这也会给你这些情况.您可以对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
Run Code Online (Sandbox Code Playgroud)
此外,需要检查db_datawriter的成员资格,因为它提供了隐式的INSERT,UPDATE和DELETE权限,这意味着您不会在权限DMV或其衍生产品中看到它.
小智 9
我喜欢 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
Run Code Online (Sandbox Code Playgroud)
要查看特定数据库上的所有授权,请使用:
Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES
Run Code Online (Sandbox Code Playgroud)
要查看特定数据库上的删除授权,请使用以下命令:
Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE PRIVILEGE_TYPE = 'DELETE'
Run Code Online (Sandbox Code Playgroud)
要列出可以控制的所有权限,您可以使用该功能fn_my_permission.此查询列出服务器上的所有权限:
select * from fn_my_permissions(NULL, NULL)
Run Code Online (Sandbox Code Playgroud)
您必须使用具有sysadmin角色的帐户登录.
您可以使用以下参数优化函数调用.
对于数据库的所有权限:
select * from fn_my_permissions(NULL, 'database')
Run Code Online (Sandbox Code Playgroud)
对于dbo 架构的所有权限:
select * from fn_my_permissions('dbo', 'schema')
Run Code Online (Sandbox Code Playgroud)
对于表的所有权限:
select * from fn_my_permissions('dbo.test', 'object')
Run Code Online (Sandbox Code Playgroud)