web-dev-qa-db-fra.com

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

J'ai une question sur Types de table définis par l'utilisateur dans SQL Server 2008.

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

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

L'autorisation EXECUTE a été refusée sur l'objet 'ourTableType', la base de données 'ourDatabase', le schéma 'ourSchema'.

Pourquoi est-ce si? Pourquoi devons-nous définir des autorisations sur les types de table définis par l'utilisateur? Pourquoi ne suffit-il pas de définir des autorisations uniquement sur la procédure stockée qui l'utilise? Et si nous devons le définir quoi qu'il arrive, 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 définir l'autorisation sur Control dans la fenêtre des propriétés résout le problème et la procédure stockée s'exécute sans problème.

81
Janez

J'espère vraiment que vous avez résolu cela 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
179
mccow002

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

Une solution de contournement consiste à modifier la procédure stockée pour exécuter en tant qu'utilisateur différent . Si vous le faites fonctionner en tant que SELF, il sera exécuté sous le créateur du proc stocké, ce qui est extrêmement dangereux. Pourtant, si vous n'avez pas d'autre option:

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF
3
rkw