L'autorisation EXECUTE a été refusée sur l'objet 'xxxxxxx', base de données 'zzzzzzz', schéma 'dbo'

187

J'ai des problèmes pour exécuter une fonction.

Voici ce que j'ai fait:

  1. Créez une fonction à l'aide de SQL Server Management Studio. Il a été créé avec succès.
  2. J'ai ensuite essayé d'exécuter la fonction nouvellement créée et voici ce que j'obtiens:

L'autorisation EXECUTE a été refusée sur l'objet 'xxxxxxx', base de données 'zzzzzzz', schéma 'dbo'.

upendra parmar
la source
S'il a le rôle db_owner, l'utilisateur peut également exécuter (pas égal à accorder exec ...)
hazjack
J'ai eu cette erreur lorsqu'il y avait une erreur de syntaxe dans mon instruction SQL. Essentiellement, j'avais fusionné GOet Createen GOCreate. D'autres erreurs de syntaxe semblent également donner cette erreur.
Ganesh Kamath - 'Code Frenzy'

Réponses:

163

On dirait que vous devez accorder l'autorisation d'exécution à l'utilisateur (ou à un groupe dont il fait partie) pour la procédure stockée en question.

Par exemple, vous pouvez accorder l'accès ainsi:

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC
Rowland Shaw
la source
2
Salut, je sais que c'était il y a un peu de temps, mais j'ai une question. Une telle action pourrait-elle avoir des problèmes de sécurité? Ouvre-t-il SP pour être utilisé par tout le monde?
Valentyn Vynogradskiy
9
Oui, il permet à toute personne disposant d'une connexion à la base de données d'exécuter la procédure stockée. Je m'attendrais à ce que les personnes préoccupées par la sécurité accordent l'accès au groupe concerné dans leur base de données .
Rowland Shaw
7
Vous pouvez également utiliser GRANT EXEC TO PUBLICpour accorder l'accès à tous les objets de la base de données
sohaiby
2
Je n'accorderais jamais d'autorisations d'exécution au rôle public. De toute façon, dans notre environnement, il était obligatoire que le rôle public soit désactivé. J'accorde toujours des autorisations d'exécution à un utilisateur spécifique ou à un rôle créé explicitement à cet effet.
user1161391
4
Pourquoi tout le monde vote-t-il les commentaires suggérant de donner au PUBLIC le droit d'exécuter quoi que ce soit dans une base de données? C'est un cas particulier pas le defacto.
Sam Thiru
111

La meilleure solution que j'ai trouvée est de créer un nouveau rôle de base de données ie

CREATE ROLE db_executor;

puis accordez à ce rôle l'autorisation d'exécution.

GRANT EXECUTE TO db_executor;

Désormais, lorsque vous accédez aux propriétés de l'utilisateur, accédez à Mappage des utilisateurs et sélectionnez la base de données dans laquelle vous avez ajouté un nouveau rôle, le nouveau rôle sera désormais visible dans la section Appartenance au rôle de base de données pour:

Pour plus de détails, lisez l'article complet

Kazim
la source
8
Cette réponse est la meilleure si vous devez accorder EXECUTE pour tous les SP à une connexion utilisateur particulière - sans utiliser public ou db_owner. Cela semble être la réponse la plus prudente et la plus utile ici.
jcollum
1
Pour une raison quelconque, c'est la seule réponse qui fonctionne pour moi sur SQL Server 2012. Donner à mon utilisateur l'autorisation EXECUTE explicite ne fonctionne pas. Cela ne fonctionne que s'il hérite de l'autorisation via un rôle.
Keith
1
Cela devrait être la réponse. Cela a fonctionné comme un charme pour moi. Merci beaucoup!
Shahbaaz
Ensuite, ajoutez-le au compte tel queEXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
ΩmegaMan
72

Dans Sql Server Management Studio:

allez juste à security->schema->dbo .

Double-cliquez sur dbo, puis cliquez sur permission tab->(blue font)view database permissionet n'hésitez pas à faire défiler les champs obligatoires tels que "execute".Aidez-vous à choisir en utilisant grantou des denycontrôles. J'espère que cela aidera :)

Suhail Mumtaz Awan
la source
52

vous devez exécuter quelque chose comme ça

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user]
Iain
la source
4
C'était ce dont j'avais besoin, mais je devais faire [domain\user]plutôt que'domain\user'
Paul Stephenson
45

Cela fonctionnera si vous essayez d'accorder une autorisation aux utilisateurs ou aux rôles.

Utilisation de Microsoft SQL Server Management Studio:

  1. Aller à: Bases de données
  2. Faites un clic droit sur dbo.my_database
  3. Choisissez: Propriétés
  4. Dans le panneau de gauche, cliquez sur: Permissions
  5. Sélectionnez l'utilisateur ou le rôle et dans le panneau de nom
  6. Recherchez Exécuter dans dans les autorisations et cochez: Accorder, Avec Accorder ou Refuser
csebryam
la source
Malheureusement, l'utilisateur dispose déjà des autorisations d'exécution! C'est pourquoi c'est si déroutant ....
Douglas Gaskell
Merci Keim, cela fonctionne parfaitement quand je coche Grant
Rosh
16

Donner une telle autorisation peut être dangereux, surtout si votre application Web utilise le même nom d'utilisateur.

Désormais, l'utilisateur Web (et le World Wide Web) a également l'autorisation de créer et de déposer des objets dans votre base de données. Pensez à l'injection SQL!

Je recommande d'accorder des privilèges d'exécution uniquement à l'utilisateur spécifique sur l'objet donné comme suit:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

Désormais, l'utilisateur myusernameNoquotes peut exécuter la procédure storedProcedureNameNoquotes sans autres autorisations inutiles sur vos précieuses données.

AMAR PANRAY
la source
3

Si vous rencontrez des problèmes tels que la question posée ci-dessus concernant l'exception levée lorsque la solution est exécutée, le problème est l'autorisation, qui n'est pas correctement accordée aux utilisateurs de ce groupe pour accéder à la base de données / procédure stockée. Tout ce que vous devez faire est de faire quelque chose comme ce que j'ai ci-dessous, en remplaçant le mien par le nom de votre base de données, les procédures stockées (fonction) et le type d'autorisation ou de rôle ou à qui vous accordez l'accès.

USE [StableEmployee]
GO
GRANT EXEC ON dbo.GetAllEmployees TO PUBLIC

/ ****** Objet: StoredProcedure [dbo]. [GetAllEmployees] Date du script: 27/01/2016 16:27:27 ****** /

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[GetAllEmployees]
as
Begin
Select EmployeeId, Name, Gender, City, DepartmentId
From tblEmployee

End
Okwo Moïse
la source
2

Vous pouvez donner à tout le monde l'autorisation d'exécution:

GRANT Execute on [dbo].your_object to [public]

«Public» est le rôle de base de données par défaut dont tous les utilisateurs sont membres.

philu
la source
1

J'ai rencontré le même problème et je l'ai résolu en donnant la permission de db_owner aussi à l'utilisateur de la base de données.

Singaravelan
la source
11
je ne pense pas que ce soit une bonne solution ... parce que je ne peux pas donner cette permission à mon application Web .. je ne sais pas qui votent pour ça
Mina Gabriel
7
Non recommandé, car ce n'est pas très sûr. Vous devriez créer des rôles appropriés au lieu d'utiliser db_owner qui a un contrôle total sur toute la base de données
Yetiish
1

Si vous rendez cet utilisateur spécial pour une base de données spécifique, alors peut-être ne le définissez-vous pas comme db_owner dans le "mappage utilisateur" des propriétés

Fatemeh M. Rezaie
la source
1

vous feriez mieux de modifier les rôles de serveur, qui a été conçu pour les privilèges de sécurité. ajoutez le rôle de serveur sysadmin à votre utilisateur. pour une meilleure sécurité, vous pouvez avoir vos rôles de serveur personnalisés. mais cette approche vous donnera ce que vous voulez pour le moment.

  1. Explorateur d'objets -> Serveur -> Sécurité -> Connexions
  2. Faites un clic droit sur l'utilisateur souhaité
  3. Accédez aux rôles de serveur sur le côté gauche
  4. Assurez-vous que sysadmin est coché
  5. Appuyez sur OK et redémarrez votre serveur SQL

Bonne chance

entrez la description de l'image ici

Ali Kashanchi
la source
1
sysadmin est excessif (et dangereux)
Trubs
0

voici comment donner la permission à un utilisateur non public,

Requête directe:

Use MyDatabase Grant execute on [dbo].[My-procedures-name] to [IIS APPPOOL\my-iis-pool] Go

Mando Basha
la source