Comment accorder des autorisations sur une fonction table

21

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!

Jack Frost
la source
Comme vous retournez maintenant une table, l'instruction GRANT doit être GRANT SELECT, plutôt que GRANT EXECUTE.
Mike

Réponses:

33

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

Tu dois 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.

Mark Sinkinson
la source
Et selon le commentaire de RDFozz sur une autre réponse, si le nom d'utilisateur a des caractères spéciaux (comme une barre oblique inverse, comme dans DOMAINNAME \ username), vous devez mettre le nom d'utilisateur entre crochets, à savoir:grant select on functionName to [DOMAINNAME\username];
youcantryreachingme
0

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

Jason
la source
Les crochets sont facultatifs, sauf si le nom d'utilisateur comprend un caractère spécial. Étant donné que la barre oblique inversée est un caractère spécial et fait souvent partie du nom d'utilisateur pour les utilisateurs avec les connexions d'authentification Windows, il est probablement plus sûr d'avoir l'habitude d'utiliser les crochets.
RDFozz
-4

J'ai essayé d'utiliser:

GRANT SELECT ON functionName TO another_user

Mais ça n'a pas marché, alors, j'ai utilisé à la EXECUTEplace de SELECT, et ça marche maintenant

Ahmed Negm
la source
Je suis curieux de savoir comment vous avez géré cela, car essayer de grant executesur une fonction SQL générera toujours une erreur.
Ian Kemp
3
Ce n'était probablement pas une fonction table, c'est pourquoi cela a fonctionné.
Diego