授予Exec一组存储过程

时间:2014-09-16 09:52:25

标签: tsql sql-server-2012

我在数据库中有大约500个以mysp_为前缀的程序。

目前我有两个角色Role1Role2,执行程序的权限分散在其中。

我需要删除Role2(这不是问题),然后Grant Exec删除我Role1的每个程序。

有人可以建议怎么做吗?我可以轻松地Grant执行一个程序,但不能选择一些程序(例如那些以mysp_为前缀的程序)。

2 个答案:

答案 0 :(得分:1)

这个怎么样?

SELECT
    'GRANT EXECUTE ON ' + OBJECT_SCHEMA_NAME(object_id) + '.' + name + ' TO Role1'
FROM 
    sys.procedures
WHERE
    Name LIKE 'mysp%'

这将生成一个语句列表作为输出,您可以将其从输出网格复制到新的查询窗口然后执行 - 现在所有程序都被授予Role1

答案 1 :(得分:1)

您可以使用动态SQL和游标迭代这些过程:

DECLARE @ProcName VARCHAR(100)
DECLARE @SQL VARCHAR(100)
DECLARE DynamicSQL CURSOR FOR
SELECT Name FROM sysobjects WHERE xtype = 'P' and Name like 'mysp_%'

OPEN DynamicSQL

FETCH NEXT FROM DynamicSQL INTO @ProcName
WHILE @@Fetch_Status = 0
BEGIN

  SET @SQL = 'GRANT EXEC ON ' + @ProcName + ' TO Role1'
  PRINT @SQL
  --EXEC(@SQL)

FETCH NEXT FROM DynamicSQL INTO @ProcName
END

CLOSE DynamicSQL
DEALLOCATE DynamicSQL

一旦您对输出感到满意,只需取消注释EXEC部分!