为多个存储过程授予数据库角色执行权限的快速方法

25
考虑这样一种情况,数据库具有SQL数据库角色或应用程序角色。任务是授予{{n}}个存储过程的执行权限。
使用SQL Management Studio时,有一个很好的屏幕可帮助为角色应用对象权限。

SQL Management Studio

以下是应用权限的步骤:
  • 在“可保护项”列表中选择要授予/拒绝权限的对象。
  • 导航到下面的“显式权限”列表。
  • 根据需要选择授予或拒绝复选框。
重复以上步骤,针对n个对象执行。在执行100+个对象时,可以播放一些音乐以保持娱乐!肯定有更好的方法!这是一个大规模的点击操作。
问题:
使用 SQL Server Management Studio 2005 是否有更快的方法执行此任务?也许是另一个 GUI 工具(最好是免费的)?
是否有创建 T-SQL 脚本以自动执行此任务的建议?例如,创建所有存储过程名称的表,循环并应用 exec 权限?

5
你是否考虑过将所有的程序放在一个模式中,然后对该模式授予执行权限? - Remus Rusanu
这就是为什么GUI工具及其依赖很糟糕的原因。 - RBarryYoung
5个回答

35
USE database_name;
GRANT EXECUTE TO [security_account];

别忘了括号 :)


我该如何在SSMS Gui或通过TSQL验证这个呢? - nojetlag

18

你可以这样做,但我不确定这有多安全。

/* CREATE A NEW ROLE */
CREATE ROLE db_executor

/* GRANT EXECUTE TO THE ROLE */
GRANT EXECUTE TO db_executor

12
这应该可以解决问题:
CREATE PROC SProcs_GrantExecute( 
    @To AS NVARCHAR(255)
    , @NameLike AS NVARCHAR(MAX)
    , @SchemaLike as NVARCHAR(MAX) = N'dbo'
    ) AS
/*
 Proc to Authorize a role for a whole bunch of SProcs at once
*/
DECLARE @sql as NVARCHAR(MAX)
SET @sql = ''

SELECT @sql = @sql + '
 GRANT EXECUTE ON OBJECT::['+ROUTINE_SCHEMA+'].['+ROUTINE_NAME+'] TO '+@To+';'
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME LIKE @NameLike
 AND ROUTINE_SCHEMA LIKE @SchemaLike

PRINT @sql
EXEC(@sql)

这是极其易受注入攻击的,所以仅供管理员使用。


我只想补充一点,Remus建议使用模式是首选方法,如果可行的话。


太棒了!你刚刚为这个初级程序员节省了很多时间。谢谢! - onefootswill
看起来有点过头了! - Mohsen Kamrani

6
最简单的方法是:
GRANT EXECUTE ON myproc TO x

其中x =

  1. SQL用户
  2. 角色
  3. AD组/账户

2

只需更新dbo模式并向所需的用户/角色添加对该模式的EXECUTE权限即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接