L’autorisation EXECUTE est refusée sur les types de table définis par l’utilisateur?

J’ai une question sur les types de table définis par l’ utilisateur dans SQL Server 2008.

Pour le besoin d’une application ASP.NET, nous avons défini nos propres types de table sur SQL Server 2008 pour les utiliser comme parameters dans les procédures stockées (lors de l’exécution de la commande sql dans l’application ASP.NET, nous transmettons l’object DataTable comme paramètre de la procédure stockée). voir ici pour un exemple )

Le problème est que lorsque nous exécutons la commande SQL (exécuter la procédure stockée) à partir d’ASP.NET, nous obtenons une erreur:

L’autorisation EXECUTE a été refusée sur l’object ‘ourTableType’, firebase database ‘ourDatabase’, schéma ‘ourSchema’.

Pourquoi est-ce si? Pourquoi avons-nous besoin de définir une autorisation sur les types de table définis par l’utilisateur? Pourquoi ne suffit-il pas d’avoir un jeu d’permissions juste sur la procédure stockée qui l’utilise? Et si nous devons le définir, peu importe pourquoi, il n’y a pas de type d’autorisation EXECUTE à définir dans la fenêtre des propriétés (je ne peux voir que Control , References , Take Ownership , View Definition )?

Ce que je ne comprends pas non plus, c’est que la définition de l’autorisation de Control dans la fenêtre des propriétés résout le problème et que la procédure stockée s’exécute sans problème.

J’espère vraiment que vous avez résolu ce problème maintenant, vu que la question a presque 4 mois, mais au cas où vous ne l’auriez pas fait, voici ce que je pense être la réponse.

 GRANT EXEC ON TYPE::[schema].[typename] TO [User] GO 

Si votre procédure stockée utilise sql dynamic, ce qui signifie que @sql est généré puis exécuté via exec @sql , vous aurez besoin d’une autorisation sur les tables sous-jacentes.

L’une des solutions consiste à modifier la procédure stockée pour qu’elle s’exécute en tant qu’utilisateur différent . Si vous le faites fonctionner comme SELF, il sera exécuté sous le créateur de la procédure stockée, ce qui est extrêmement dangereux. Pourtant, si vous n’avez pas d’autre option:

 CREATE PROCEDURE dbo.usp_Demo WITH EXECUTE AS SELF