110 votes

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

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

Pour les besoins 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 passons 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 une commande Sql (exécuter une procédure stockée) depuis ASP.NET, nous obtenons une erreur :

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

Pourquoi en est-il ainsi ? Pourquoi devons-nous définir l'autorisation sur les types de table définis par l'utilisateur ? Pourquoi ne suffit-il pas de définir la permission sur la procédure stockée qui l'utilise ? Et si nous devons l'établir quoi qu'il arrive, pourquoi n'y a-t-il pas d'autorisation pour les types de tables définis par l'utilisateur ? EXECUTE type de permission à 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 le fait de définir la permission de 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.

0 votes

Merci ! J'ai cherché mais ce n'est clairement pas suffisant :/.

1 votes

Essayez de mettre AS dbo à la fin. Comme ça : GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo . Cela a fonctionné pour moi.

246voto

mccow002 Points 2713

J'espère vraiment que vous avez déjà résolu ce problème, puisque la question date d'il y 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

12 votes

Mes deux centimes : En fonction du mécanisme d'authentification de votre connexion, vous devrez peut-être accorder l'accès au groupe Public. Votre autorisation ressemblerait donc à ceci : GRANT EXEC ON TYPE: :[schema].[typename] TO [Public] GO

1 votes

@dotnetguy merci beaucoup, aucune des solutions n'a fonctionné pour moi sauf la vôtre.

3voto

rkw Points 5194

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

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

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF

1 votes

Merci de me le signaler. Mais la procédure stockée ne contient pas de code SQL dynamique. Seulement du général INSERT INTO et 'UPDATE' pour lesquelles cet utilisateur dispose de toutes les autorisations nécessaires. De plus, cet utilisateur/login est spécialement réservé/créé pour cette application ASP.NET afin de pouvoir se connecter à cette base de données et d'exécuter uniquement des procédures stockées (pas de création, etc.), le créateur étant toujours le même. 'sa' ).

0 votes

Merci, c'était le problème pour moi. Les autres lecteurs ayant ce problème peuvent se référer à Permissions du serveur SQL sur les programmes stockés avec SQL dynamique pour plus de conseils.

0voto

Diryboy Points 601

Dans SSMS, vous devez cliquer sur le lien "View schema permissions" avant de cliquer sur le bouton "Search".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X