Como conceder permissões em uma função com valor de tabela

21

Eu estou fazendo a coisa certa...?

Eu tenho uma função que devolve dinheiro ...

CREATE FUNCTION functionName( @a_principal money, @a_from_date
  datetime, @a_to_date datetime, @a_rate float )  RETURNS money AS BEGIN

  DECLARE @v_dint money   set @v_dint = computation_here
     set @v_dint = round(@v_dint, 2)

  RETURN @v_dint    
END 
GO 
Grant execute on functionName to another_user 
Go

Estou apenas querendo saber se isso é possível ser convertido para iTVF?

Eu tentei fazer isso, mas recebi um erro:

CREATE FUNCTION functionName ( @a_principal money, @a_from_date
  datetime, @a_to_date datetime, @a_rate float )  
RETURNS TABLE AS 
RETURN SELECT returnMoney = computation_here  
GO  
Grant execute on functionName to another_user  Go

ERRO:

Msg 4606, nível 16, estado 1, linha 2 Privilégio concedido ou revogado EXECUTE não é compatível com o objeto.

Esta função é usada assim:

update table_name set interest = functionName(col1,col2...) where...

Desde já, obrigado!

Jack Frost
fonte
Como agora você está retornando uma tabela, a instrução GRANT precisa ser GRANT SELECT, em vez de GRANT EXECUTE.
4115 Mike

Respostas:

33

As funções escalares exigem EXECUTEpermissões, no entanto, quando você converte em uma função com valor de tabela, as permissões necessárias são alteradas para SELECT.

Você deve agora GRANT SELECT ON functionName TO another_user;

De BOL :

Usuários que não sejam o proprietário devem receber permissão EXECUTE em uma função (se a função tiver um valor escalar) antes de poderem usá-la em uma instrução Transact-SQL. Se a função tiver valor de tabela, o usuário deverá ter permissões SELECT na função antes de fazer referência a ela.

Mark Sinkinson
fonte
E pelo comentário do RDFozz em outra resposta, se o nome do usuário tiver caracteres especiais (como uma barra invertida, como em DOMAINNAME \ nome de usuário), será necessário colocar o nome do usuário entre colchetes, a saber:grant select on functionName to [DOMAINNAME\username];
youcantryreachingme
0

Precisa ser GRANT SELECT ON functionName TO [another_user]- entre parênteses.

Jason
fonte
Os colchetes são opcionais, a menos que o nome de usuário inclua um caractere especial. Como a barra invertida é um caractere especial e costuma fazer parte do nome de usuário para usuários com logins de autenticação do Windows, provavelmente é mais seguro ter o hábito de usar os colchetes.
RDFozz
-4

Eu tentei usar:

GRANT SELECT ON functionName TO another_user

Mas não funcionou, usei em EXECUTEvez de SELECT, e funciona agora

Ahmed Negm
fonte
Estou curioso para saber como você conseguiu isso, pois a tentativa de executar grant executeuma função SQL sempre gera um erro.
21817 Ian Kemp
3
Provavelmente não era uma função com valor de tabela, é por isso que funcionou.
Diego