¿Se deniega el permiso EJECUTAR en los tipos de tablas definidos por el usuario?

87

Tengo una pregunta sobre los tipos de tablas definidos por el usuario en SQL Server 2008.

Para la necesidad de una de las aplicaciones ASP.NET, definimos nuestros propios tipos de tabla en SQL Server 2008 para usarlos como parámetros en los procedimientos almacenados (al ejecutar el comando sql en la aplicación ASP.NET pasamos el objeto DataTable como parámetro para el procedimiento almacenado ver aquí un ejemplo )

El problema es que cuando ejecutamos el comando Sql (ejecutamos el procedimiento almacenado) desde ASP.NET obtenemos un error:

Se denegó el permiso EJECUTAR en el objeto 'ourTableType', base de datos 'ourDatabase', esquema 'ourSchema'.

¿Por qué es así? ¿Por qué necesitamos establecer permisos en tipos de tablas definidos por el usuario? ¿Por qué no es suficiente tener permisos establecidos solo en el procedimiento almacenado que lo usa? Y si tenemos que establecer que no importa qué, por qué no hay un EXECUTEtipo de permiso para establecer en la ventana de propiedades en absoluto (sólo puedo ver Control, References, Take Ownership, View Definition)?

Lo que tampoco entiendo es que establecer el permiso Controlen la ventana de propiedades resuelve el problema y el procedimiento almacenado se ejecuta sin problemas.

Janez
fuente
4
posible duplicado del parámetro con valores
Damien_The_Unbeliever
¡gracias! He buscado pero claramente no lo suficientemente bueno: /
Janez
Intenta poner AS dboal final. De esta manera: GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo. Trabajó para mi.
Jonathan
El posible duplicado del parámetro con valores
LCJ

Respuestas:

197

Realmente espero que ya hayas resuelto esto, ya que la pregunta tiene casi 4 meses, pero en caso de que no lo hayas hecho, aquí está lo que creo que es la respuesta.

GRANT EXEC ON TYPE::[schema].[typename] TO [User]
GO
mccow002
fuente
9
Mis 2 centavos: Dependiendo de su mecanismo de autenticación de conexión, es posible que deba otorgar exec al grupo público. Entonces, su subvención se vería así: GRANT EJEC EN TIPO :: [esquema]. [Nombre de tipo] A [Público] GO
Sudhanshu Mishra
@dotnetguy muchas gracias, ninguna de las soluciones me funcionó excepto la tuya.
Mazen el Senih
3

Si su procedimiento almacenado usa SQL dinámico, lo que significa que @sqlse genera y luego se ejecuta a través de exec @sql, necesitará permiso otorgado en las tablas subyacentes.

Una solución alternativa es modificar el procedimiento almacenado para que se ejecute como un usuario diferente . Si lo hace ejecutar como SELF, se ejecutará por debajo del creador del proceso almacenado, que es extremadamente peligroso. Aún así, si no tiene otra opción:

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF
rkw
fuente
1
Gracias por señalar esto. Pero el procedimiento almacenado no tiene ningún sql dinámico. Sólo INSERT INTOdeclaraciones de tabla generales y ´UPDATE´ para las que este usuario tiene todos los permisos que necesita. Además, este usuario / inicio de sesión está especialmente reservado / creado para esta aplicación ASP.NET para poder conectarse a esta base de datos y solo ejecutar procedimientos almacenados (no crear, etc., el creador es siempre 'sa').
Janez
Gracias, ese fue el problema para mí. Otros lectores con este problema pueden consultar Permisos de SQL Server en procesos almacenados con SQL dinámico para obtener más sugerencias.
Nickolay