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 EXECUTE
tipo 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 Control
en la ventana de propiedades resuelve el problema y el procedimiento almacenado se ejecuta sin problemas.
AS dbo
al final. De esta manera:GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo
. Trabajó para mi.Respuestas:
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
fuente
Si su procedimiento almacenado usa SQL dinámico, lo que significa que
@sql
se genera y luego se ejecuta a través deexec @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
fuente
INSERT INTO
declaraciones 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'
).