Die EXECUTE-Berechtigung wurde für das Objekt 'xxxxxxx', die Datenbank 'zzzzzzz' und das Schema 'dbo' verweigert.

187

Ich habe Probleme beim Ausführen einer Funktion.

Folgendes habe ich getan:

  1. Erstellen Sie eine Funktion mit SQL Server Management Studio. Es wurde erfolgreich erstellt.
  2. Ich habe dann versucht, die neu erstellte Funktion auszuführen, und hier ist, was ich bekomme:

Die EXECUTE-Berechtigung wurde für das Objekt 'xxxxxxx', die Datenbank 'zzzzzzz' und das Schema 'dbo' verweigert.

Upendra Parmar
quelle
Wenn Sie die Rolle db_owner haben, kann der Benutzer auch ausführen (entspricht nicht der Ausführung von exec ...)
Hazjack
Ich habe diesen Fehler erhalten, als in meiner SQL-Anweisung ein Syntaxfehler aufgetreten ist. Im Wesentlichen hatte ich GOund Createin verschmolzen GOCreate. Andere Syntaxfehler scheinen diesen Fehler ebenfalls zu verursachen.
Ganesh Kamath - "Code Frenzy"

Antworten:

162

Klingt so, als müssten Sie dem Benutzer (oder einer Gruppe, zu der er gehört) die Ausführungsberechtigung für die betreffende gespeicherte Prozedur erteilen.

Zum Beispiel könnten Sie den Zugriff folgendermaßen gewähren:

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC
Rowland Shaw
quelle
2
Hallo, ich weiß, dass es etwas her ist, aber ich habe eine Frage. Könnte eine solche Aktion einige Sicherheitsprobleme haben? Öffnet es sp, um für alle verwendet zu werden?
Valentyn Vynogradskiy
9
Ja, es erlaubt jedem, der eine Verbindung zur Datenbank hat, die gespeicherte Prozedur auszuführen. Ich würde erwarten, dass Personen, die sich Sorgen um die Sicherheit machen, der entsprechenden Gruppe in ihrer Datenbank Zugriff gewähren .
Rowland Shaw
7
Sie können auch verwenden GRANT EXEC TO PUBLIC, um Zugriff auf alle Objekte in der Datenbank zu gewähren
sohaiby
2
Ich würde der öffentlichen Rolle niemals Ausführungsberechtigungen erteilen. Wie auch immer in unserer Umwelt war es vorgeschrieben, die öffentliche Rolle zu deaktivieren. Ich erteile einem bestimmten Benutzer oder einer Rolle, die explizit für diesen Zweck erstellt wurde, immer Ausführungsberechtigungen.
user1161391
4
Warum stimmen alle Kommentare zu, die darauf hinweisen, PUBLIC das Recht zu geben, überhaupt etwas in einer Datenbank auszuführen? Das ist ein Sonderfall, nicht der Defacto.
Sa Thiru
111

Die beste Lösung, die ich gefunden habe, ist das Erstellen einer neuen Datenbankrolle, dh

CREATE ROLE db_executor;

und erteilen Sie dann diese Rolle Exec-Berechtigung.

GRANT EXECUTE TO db_executor;

Wenn Sie nun zu den Eigenschaften des Benutzers gehen und zur Benutzerzuordnung gehen und die Datenbank auswählen, in der Sie eine neue Rolle hinzugefügt haben, wird jetzt eine neue Rolle in der Mitgliedschaft in der Datenbankrolle für: angezeigt

Für weitere Informationen lesen Sie den vollständigen Artikel

Kazim
quelle
8
Diese Antwort ist am besten geeignet, wenn Sie einem bestimmten Benutzer-Login EXECUTE für alle SPs gewähren müssen - ohne public oder db_owner zu verwenden. Scheint hier die umsichtigste und nützlichste Antwort zu sein.
JCollum
1
Aus irgendeinem Grund ist dies die einzige Antwort, die unter SQL Server 2012 für mich funktioniert. Es funktioniert nicht, meinem Benutzer die explizite EXECUTE-Berechtigung zu erteilen. Es funktioniert nur, wenn es die Berechtigung über eine Rolle erbt.
Keith
1
Dies sollte die Antwort sein. Es hat wie ein Zauber für mich funktioniert. Vielen Dank!
Shahbaaz
EXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
Fügen
72

In SQL Server Management Studio:

geh einfach zu security->schema->dbo.

Doppelklicken Sie auf dbo, klicken Sie dann auf permission tab->(blue font)view database permissionund scrollen Sie nach den erforderlichen Feldern wie "execute".Hilfe bei der Auswahl von grantoder denySteuerelementen. Hoffe das wird helfen :)

Suhail Mumtaz Awan
quelle
52

Sie müssen so etwas ausführen

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user]
Iain
quelle
4
Dies war, was ich brauchte, aber ich musste [domain\user]eher tun als'domain\user'
Paul Stephenson
45

Dies funktioniert, wenn Sie versuchen, Benutzern oder Rollen Berechtigungen zu erteilen.

Verwenden von Microsoft SQL Server Management Studio:

  1. Gehen Sie zu: Datenbanken
  2. Klicken Sie mit der rechten Maustaste auf dbo.my_database
  3. Wählen Sie: Eigenschaften
  4. Klicken Sie im linken Bereich auf: Berechtigungen
  5. Wählen Sie den Benutzer oder die Rolle und im Namensfenster
  6. Suchen Sie in Berechtigungen Ausführen in und aktivieren Sie das Kontrollkästchen: Gewähren, Mit Gewähren oder Verweigern
csebryam
quelle
Leider hat der Benutzer bereits Ausführungsberechtigungen! Deshalb ist das so verwirrend ...
Douglas Gaskell
Danke Keim, das funktioniert perfekt, wenn ich Grant
Rosh
16

Das Erteilen einer solchen Berechtigung kann gefährlich sein, insbesondere wenn Ihre Webanwendung denselben Benutzernamen verwendet.

Jetzt hat der Webbenutzer (und das gesamte World Wide Web) auch die Berechtigung, Objekte in Ihrer Datenbank zu erstellen und abzulegen. Denken Sie an SQL Injection!

Ich empfehle, Execute-Berechtigungen nur dem bestimmten Benutzer für das angegebene Objekt wie folgt zu gewähren:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

Jetzt kann der Benutzer myusernameNoquotes die Prozedur gespeicherte ProzedurnameNoquotes ohne andere unnötige Berechtigungen für Ihre wertvollen Daten ausführen.

AMAR PANRAY
quelle
3

Wenn Sie Probleme wie die oben gestellte Frage bezüglich der Ausnahme haben, die bei der Ausführung der Lösung ausgelöst wird, ist das Problem die Berechtigung, die den Benutzern dieser Gruppe nicht ordnungsgemäß für den Zugriff auf die Datenbank / gespeicherte Prozedur erteilt wurde. Alles, was Sie tun müssen, ist, etwas wie das zu tun, was ich unten habe, und meinen durch Ihren Datenbanknamen, gespeicherte Prozeduren (Funktion) und die Art der Berechtigung oder Rolle zu ersetzen oder wem Sie den Zugriff gewähren.

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

/ ****** Objekt: StoredProcedure [dbo]. [GetAllEmployees] Skriptdatum: 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 Moses
quelle
2

Sie können jedem die Ausführungserlaubnis geben:

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

"Öffentlich" ist die Standarddatenbankrolle, in der alle Benutzer Mitglied sind.

philu
quelle
1

Ich hatte das gleiche Problem und habe es gelöst, indem ich dem Datenbankbenutzer auch die Berechtigung db_owner erteilt habe.

Singaravelan
quelle
11
Ich denke nicht, dass dies eine gute Lösung ist ... weil ich meiner Webanwendung diese Erlaubnis nicht geben kann. Ich weiß nicht, wer dies abstimmt
Mina Gabriel
7
Nicht zu empfehlen, da dies sehr unsicher ist. Sie sollten geeignete Rollen erstellen, anstatt db_owner zu verwenden, das die volle Kontrolle über die gesamte Datenbank hat
Yetiish
1

Wenn Sie diesen Benutzer speziell für eine bestimmte Datenbank festlegen, legen Sie ihn möglicherweise nicht als db_owner in der "Benutzerzuordnung" von Eigenschaften fest

Fatemeh M. Rezaie
quelle
1

Sie sollten besser die Serverrollen ändern, die für Sicherheitsberechtigungen konzipiert wurden. Fügen Sie Ihrem Benutzer die Sysadmin-Serverrolle hinzu. Für eine bessere Sicherheit haben Sie möglicherweise Ihre benutzerdefinierten Serverrollen. Aber dieser Ansatz gibt Ihnen das, was Sie jetzt wollen.

  1. Objekt-Explorer -> Server -> Sicherheit -> Anmeldungen
  2. Klicken Sie mit der rechten Maustaste auf den gewünschten Benutzer
  3. Gehen Sie zu Serverrollen auf der linken Seite
  4. Stellen Sie sicher, dass sysadmin aktiviert ist
  5. Klicken Sie auf OK und starten Sie Ihren SQL Server neu

Viel Glück

Geben Sie hier die Bildbeschreibung ein

Ali Kashanchi
quelle
1
Sysadmin ist total übertrieben (und gefährlich)
Trubs
0

Hier erfahren Sie, wie Sie einem nicht öffentlichen Benutzer die Berechtigung erteilen.

Direkte Abfrage:

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

Mando Basha
quelle