web-dev-qa-db-fra.com

Comment accorder des autorisations sur une fonction table

Suis-je en train de bien faire ...?

J'ai une fonction qui rapporte de l'argent ...

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

Je me demande simplement si cela peut être converti en iTVF?

J'ai essayé de faire ça mais j'ai une erreur:

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

ERREUR:

Msg 4606, niveau 16, état 1, ligne 2 Privilège accordé ou révoqué EXECUTE n'est pas compatible avec l'objet.

Cette fonction est utilisée comme ceci:

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

Merci d'avance!

22
Jack Frost

Les fonctions scalaires nécessitent des autorisations EXECUTE, mais lorsque vous avez converti une fonction à valeur table, les autorisations requises changent en SELECT.

Vous devez maintenant GRANT SELECT ON functionName TO another_user;

De BOL :

Les utilisateurs autres que le propriétaire doivent disposer de l'autorisation EXECUTE sur une fonction (si la fonction a une valeur scalaire) avant de pouvoir l'utiliser dans une instruction Transact-SQL. Si la fonction a la valeur d'une table, l'utilisateur doit disposer des autorisations SELECT sur la fonction avant de la référencer.

33
Mark Sinkinson

Il doit être GRANT SELECT ON functionName TO [another_user] - avec crochets.

0
jason