2010-02-11 7 views
17

me sale el error siguiente cuando se llama a un procedimiento almacenado que tiene un parámetro valioso mesa como uno de los parámetrosvalores de tabla de parámetros en un procedimiento almacenado obtiene permisos de ejecución denegado error

El permiso EXECUTE fue negado en validationErrors de objeto' '

validationErrors es una TVP creado con la siguiente afirmación:

CREATE TYPE [dbo].[ValidationErrors] AS TABLE(
    [ErrorMessage] [varchar](255) NOT NULL 
) 

el usuario que ejecuta el procedimiento almacenado tiene privilegios de ejecución en el procedimiento almacenado. Sin embargo, sigo recibiendo el error anterior. Alguna idea?

Respuesta

32

Creo que también puede necesitar otorgar permisos al tipo de usuario.

Referencias para la concesión de permisos a los tipos:
SQL 2005
SQL 2008

Actualización:
Re: ¿por qué tiene que conceder permisos en el tipo cuando se tiene permisos en el procedimiento almacenado. No sé la razón definitiva, pero BOL dice:

diferencia de los tipos definidos por el usuario creadas por utilizando sp_addtype, la base de datos pública papel no se concede automáticamente el permiso Referencias sobre los tipos que son creados por usando CREATE TYPE. Este permiso debe otorgarse por separado.

Actualización 2: para conceder permisos EXECUTE, que había corrido en este SSMS:

GRANT EXECUTE ON TYPE::dbo.ValidationErrors TO SomeUser; 
+0

Otorgué el permiso de "control" al objeto y parece estar funcionando bien ahora. Simplemente agregando "referencias" y "vista de definición" no ayudó. Personalmente, no entiendo el requisito ya que es un tipo y, generalmente, cuando se concede la ejecución del procedimiento almacenado, los objetos a los que se hace referencia no necesitan permisos específicos para otorgarse. Sin embargo, esto podría tener algo que ver con el hecho de que el usuario está en el rol "público". ¿Alguna idea? – chiefbrownbotom

+0

¿Intentó otorgar permisos de EJECUTAR (en lugar de control)? Podría valer la pena intentar eso antes de recurrir al control – AdaTheDev

+2

No vi ningún lugar para otorgar la ejecución desde el estudio de administración sql. Solo vi los que enumeré arriba. ¿Debo usar t-sql para otorgar esto? – chiefbrownbotom

2

Como @chiefbrownbotom dice, la razón por la que necesita permisos de ejecución del tipo de tabla es que la tabla se crea antes (y por lo tanto fuera de) la llamada al proceso. Para ilustrar esto, ejecute un rastreo de SQL Profiler y llame a su proc. Verá algo como esto, que puede sorprender ...

DECLARE @p1 TABLE AS YourTableType 
INSERT INTO @p1 (col1, col2, col3) VALUES ('val1','val2','val3') 
INSERT INTO @p1 (col1, col2, col3) VALUES ('val1','val2','val3') 
... 
EXEC usp_YourStoredProc @p1 
1

control Grant el TIPO :: schema.mytabletype a RoleOrMember

Esto funcionó para mí; muchas gracias a @chiefbrownbotom en el comentario anterior.

Cuestiones relacionadas