visual studio practices microsoft library example data .net sql-server enterprise-library

.net - studio - El parámetro de valor de tabla en un procedimiento almacenado obtiene los permisos de ejecución error denegado



microsoft enterprise library visual studio 2017 (3)

Recibo el siguiente error al llamar a un procedimiento almacenado que tiene un parámetro con valores de tabla como uno de los parámetros

El permiso EXECUTE se denegó en el objeto ''ValidationErrors''

ValidationErrors es un TVP creado con la siguiente declaració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, todavía me sale el error anterior. ¿Algunas ideas?


Como dice @chiefbrownbotom, la razón por la que necesita permisos de ejecución en el 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 del Analizador de SQL y llame a su proc. Verás algo como esto que te 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


Creo que es posible que también deba otorgar permisos de usuario al tipo.

Referencias para conceder permisos a tipos:
SQL 2005
SQL 2008

Actualizar:
Re: por qué tiene que otorgar permisos en el tipo cuando tiene permisos en el sproc. No sé la razón definitiva, pero BOL dice:

A diferencia de los tipos definidos por el usuario creados mediante el uso de sp_addtype, a la función de base de datos pública no se le otorga automáticamente el permiso de REFERENCIAS en los tipos que se crean utilizando CREATE TYPE. Este permiso debe ser otorgado por separado.

Actualización 2: Para GRANT EXECUTE permisos, ejecutaría esto en SSMS:

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


Otorgar control en TYPE :: schema.mytabletype a RoleOrMember

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