Cómo otorgar permisos en una función con valores de tabla

21

Lo estoy haciendo bien...?

Tengo una función que devuelve dinero ...

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

¿Me pregunto si esto se puede convertir a iTVF?

Intenté hacer esto pero recibí un error:

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

ERROR:

Msg 4606, Nivel 16, Estado 1, Línea 2 Privilegio otorgado o revocado EJECUTAR no es compatible con el objeto.

Esta función se usa así:

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

¡Gracias por adelantado!

Jack Frost
fuente
Como ahora está devolviendo una tabla, la instrucción GRANT debe ser GRANT SELECT, en lugar de GRANT EXECUTE.
Mike

Respuestas:

33

Las funciones escalares requieren EXECUTEpermisos, sin embargo, cuando se convierte en una función con valores de tabla, los permisos requeridos cambian a SELECT.

Debes ahora GRANT SELECT ON functionName TO another_user;

De BOL :

Los usuarios que no sean el propietario deben tener permiso EXECUTE en una función (si la función tiene un valor escalar) antes de que puedan usarla en una instrucción Transact-SQL. Si la función tiene valores de tabla, el usuario debe tener permisos SELECCIONAR sobre la función antes de hacer referencia a ella.

Mark Sinkinson
fuente
Y según el comentario de RDFozz sobre otra respuesta, si el nombre de usuario tiene caracteres especiales (como una barra diagonal inversa, como en DOMAINNAME \ username), debe poner el nombre de usuario entre corchetes, a saber:grant select on functionName to [DOMAINNAME\username];
youcantryreachingme
0

Tiene que ser GRANT SELECT ON functionName TO [another_user], con paréntesis.

jason
fuente
Los corchetes son opcionales a menos que el nombre de usuario incluya un carácter especial. Dado que la barra diagonal inversa es un carácter especial, y a menudo será parte del nombre de usuario para los usuarios con inicios de sesión de autenticación de Windows, probablemente sea más seguro tener la costumbre de usar los corchetes.
RDFozz
-4

Traté de usar:

GRANT SELECT ON functionName TO another_user

Pero no funcionó, entonces, usé en EXECUTElugar de SELECT, y funciona ahora

Ahmed Negm
fuente
Tengo curiosidad acerca de cómo manejó esto, ya que intentar grant executeuna función SQL siempre arrojará un error.
Ian Kemp
3
Probablemente no era una función con valores de tabla, por eso funcionó.
Diego