我在数据库中有大约500个以mysp_
为前缀的程序。
目前我有两个角色Role1
和Role2
,执行程序的权限分散在其中。
我需要删除Role2
(这不是问题),然后Grant Exec
删除我Role1
的每个程序。
有人可以建议怎么做吗?我可以轻松地Grant
执行一个程序,但不能选择一些程序(例如那些以mysp_
为前缀的程序)。
答案 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部分!