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 权限的角色。但是,它们没有显示在这里。
如何更改我的脚本,以便它向我显示该表的所有权限?
我有几个存储过程,可用于显示给定数据库的所有权限。对于单个用户/主体或所有人。 sp_dbpermissions和sp_srvpermissions。
sp_dbpermissions(sp_srvpermissions 在服务器级别相同)的输出如下所示
页面外有相应的撤销/授予/拒绝命令。
仅供参考,我这里的示例是使用“ALL”作为数据库参数运行的,因此它显示所有数据库的输出,而不仅仅是一个数据库。
我主要将它们作为研究工具,因此您将找到一些参数,这些参数可让您搜索直接应用于给定对象的权限(类似于上面的查询)或给定角色的成员(以及该角色的权限)等。
注意:Minion 还有一个企业版,它对权限进行了大量详细的数据收集,这很可能为您提供您想要的东西。然而,它是一个付费程序。(如果你能说服你的管理层接受这笔费用,那可能是值得的)
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)
当我运行上面的脚本时,我得到以下结果,其中包括对反映在我的表上的架构的权限。
归档时间: |
|
查看次数: |
54171 次 |
最近记录: |