显示表的所有权限的脚本

Mar*_*lli 5 sql-server permissions scripting logins automation

在我的数据库中,我有一个名为 spGen2_tblIE_SchedProcess_Update 的过程。

当我运行这个脚本时

select * from sys.objects
where name = 'spGen2_tblIE_SchedProcess_Update'
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在同一个数据库中,我有一个名为 tblIE_Step 的表

当我运行以下脚本时

select * from sys.objects
where name = 'tblIE_Step'
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

然后我想查看对象的所有权限

当我检查我的存储过程时,我运行了这个脚本:

select 'Proc' = SCHEMA_NAME(p.schema_id)+'.'+p.name
    , 'Type' = per.state_desc, 'Permission' = per.permission_name
    , 'Login' = pri.name, 'Type' = pri.type_desc 
    , *
From sys.objects as p
left join sys.database_permissions as per on p.object_id = per.major_id
left join sys.database_principals as pri on per.grantee_principal_id = pri.principal_id
where p.object_id = 87671360
Run Code Online (Sandbox Code Playgroud)

我得到了权限:

在此处输入图片说明

但是当我为我的桌子运行相同的东西时,我什么也没得到:

select 'Proc' = SCHEMA_NAME(p.schema_id)+'.'+p.name
    , 'Type' = per.state_desc
    , 'Permission' = per.permission_name
    , 'Login' = pri.name, 'Type' = pri.type_desc 
    , *
From sys.objects as p
left join sys.database_permissions as per on p.object_id = per.major_id
left join sys.database_principals as pri on per.grantee_principal_id = pri.principal_id
where p.object_id = 389576426
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我知道有些登录名和组属于具有 db_reader 和 db_writer 权限的角色。但是,它们没有显示在这里。

如何更改我的脚本,以便它向我显示该表的所有权限?

Ken*_*her 6

我有几个存储过程,可用于显示给定数据库的所有权限。对于单个用户/主体或所有人。 sp_dbpermissionssp_srvpermissions

sp_dbpermissions(sp_srvpermissions 在服务器级别相同)的输出如下所示

在此输入图像描述

页面外有相应的撤销/授予/拒绝命令。

仅供参考,我这里的示例是使用“ALL”作为数据库参数运行的,因此它显示所有数据库的输出,而不仅仅是一个数据库。

我主要将它们作为研究工具,因此您将找到一些参数,这些参数可让您搜索直接应用于给定对象的权限(类似于上面的查询)或给定角色的成员(以及该角色的权限)等。

注意:Minion 还有一个企业版,它对权限进行了大量详细的数据收集,这很可能为您提供您想要的东西。然而,它是一个付费程序。(如果你能说服你的管理层接受这笔费用,那可能是值得的)


Mar*_*lli 5

我找到了一个很好的脚本来查看数据库对象的权限

SELECT
  (
    dp.state_desc + ' ' +
    dp.permission_name collate latin1_general_cs_as + 
    ' ON ' + '[' + s.name + ']' + '.' + '[' + o.name + ']' +
    ' TO ' + '[' + dpr.name + ']'
  ) AS GRANT_STMT
FROM sys.database_permissions AS dp
  INNER JOIN sys.objects AS o ON dp.major_id=o.object_id
  INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
  INNER JOIN sys.database_principals AS dpr ON dp.grantee_principal_id=dpr.principal_id
WHERE 1=1
    AND o.name IN ('YOUR TABLE NAME')      -- Uncomment to filter to specific object(s)
--  AND dp.permission_name='EXECUTE'    -- Uncomment to filter to just the EXECUTEs
ORDER BY dpr.name
Run Code Online (Sandbox Code Playgroud)

上面的脚本适用于数据库对象。但是,当我在 db 对象所在的架构上添加权限时,上面的脚本不会选择它,例如:

grant delete on schema::dbo to [db_webUser] 
GO
Run Code Online (Sandbox Code Playgroud)

所以对于这种情况,我在这里找到了这个脚本,它也可以满足这个需求

------------------------------------------------------------------------------------------------------------------
-- http://schottsql.blogspot.co.uk/2011/02/quickly-script-permissions-in-sql-2005.html
------------------------------------------------------------------------------------------------------------------


SELECT
state_desc + ' ' + permission_name +
' on ['+ ss.name + '].[' + so.name + ']
to [' + sdpr.name + ']'
COLLATE LATIN1_General_CI_AS as [Permissions T-SQL]
FROM SYS.DATABASE_PERMISSIONS AS sdp
JOIN sys.objects AS so
     ON sdp.major_id = so.OBJECT_ID
JOIN SYS.SCHEMAS AS ss
     ON so.SCHEMA_ID = ss.SCHEMA_ID
JOIN SYS.DATABASE_PRINCIPALS AS sdpr
     ON sdp.grantee_principal_id = sdpr.principal_id
where 1=1
  AND so.name = 'ItemStock'

UNION

SELECT
state_desc + ' ' + permission_name +
' on Schema::['+ ss.name + ']
to [' + sdpr.name + ']'
COLLATE LATIN1_General_CI_AS as [Permissions T-SQL]
FROM SYS.DATABASE_PERMISSIONS AS sdp
JOIN SYS.SCHEMAS AS ss
     ON sdp.major_id = ss.SCHEMA_ID
     AND sdp.class_desc = 'Schema'
JOIN SYS.DATABASE_PRINCIPALS AS sdpr
     ON sdp.grantee_principal_id = sdpr.principal_id
where 1=1

order by [Permissions T-SQL]
GO
Run Code Online (Sandbox Code Playgroud)

当我运行上面的脚本时,我得到以下结果,其中包括对反映在我的表上的架构的权限。

在此处输入图片说明