如何将SQL Server中的执行所有功能授予分组

问题描述 投票:0回答:1

我有一个需要授予特定组执行权限的函数列表,我发现查询应该像这样执行

GRANT EXECUTE ON [dbo].[FunctionName] TO [GroupName]

但是由于我的数据库中有 40 个函数,所以我需要执行 40 次并更新函数名称。当我有新的函数时,我需要以相同的方式执行新的函数,我的问题是是否有一个脚本/函数可以获取数据库中的所有函数名称并只执行一次。我可以使用此代码获取函数列表:

SELECT name AS function_name
FROM sys.objects
WHERE type_desc LIKE '%FUNCTION%'

我还创建了一个函数来执行它:

ALTER function [dbo].[listFunction]()
returns int
AS
  BEGIN
  declare @Result int;
  declare @ListFn nvarchar(100);
  set @ListFn = (
                        SELECT name AS function_name
FROM sys.objects
WHERE type_desc LIKE '%FUNCTION%'
                        );
if @ListFn=null
set @Result = 1
else
set @Result = 0
return @Result
end

但是缺少如何迭代每个函数并授予执行权限,所以有什么帮助吗?

编辑:我已经使用化学法编辑了查询

DECLARE @SchemaName varchar(max)
DECLARE @GroupName varchar(max)
SET @SchemaName = 'dbo'
SET @GroupName = '[groupname]'
select 'GRANT EXECUTE ON OBJECT::' + @SchemaName + '.' + P.name  + ' to ' + @GroupName
from sys.objects P
inner join sys.schemas S on P.schema_id = S.schema_id
where S.name = @SchemaName
and P.type_desc LIKE '%FUNCTION%'

编辑2:我创建了一个执行授予的程序,因为它不能与函数一起使用,所以我执行了它并且没有显示任何异常,但我不知道它是否正确:

CREATE PROCEDURE ExecuteAllFunctions
AS
  BEGIN
  DECLARE @i int
  declare @Result int;
  declare @ListFn nvarchar(100);
  DECLARE @a TABLE (fnct nvarchar(max))
  DECLARE @SchemaName varchar(max)
  --DECLARE @a TABLE (id uniqueidentifier)
DECLARE @GroupName varchar(max)
SET @SchemaName = 'dbo'
SET @GroupName = '[GroupName]'

INSERT INTO @a select 'GRANT EXECUTE ON OBJECT::' + @SchemaName + '.' + P.name  + ' to ' + @GroupName
from sys.objects P
inner join sys.schemas S on P.schema_id = S.schema_id
where S.name = @SchemaName
and P.type_desc LIKE '%FUNCTION%'

--EXEC @ListFn
--SET @i = 1
--WHILE (@i <= (SELECT MAX(fnct) FROM @a))
--    BEGIN
--  set @ListFn = (select fnct from @a a where a.fnct=)
        
--        SET @i = @i + 1
--    END

--if @ListFn=null
--set @Result = 1
--else
--set @Result = 0
--return @Result
end
sql sql-server-2016 sql-function
1个回答
0
投票

也许可以在循环中使用光标:

DECLARE @fname varchar(50);
DECLARE my_cursor CURSOR FOR SELECT fnct FROM @a;
OPEN my_cursor;
FETCH NEXT FROM my_cursor INTO @fname;
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @fcmd = CONCAT(@start_cmd,@fname,@end_cmd) ;
    SELECT @fcmd AS Grant_Call; -- just to see what is happening
    EXEC(@fcmd);
    FETCH NEXT FROM my_cursor INTO @fname;
END
CLOSE my_cursor;
DEALLOCATE my_cursor;
© www.soinside.com 2019 - 2024. All rights reserved.