Wie erteilen Sie die Ausführungsberechtigung für eine einzelne gespeicherte Prozedur?


40

Normalerweise verwende ich beim Erstellen einer gespeicherten Prozedur Folgendes als eine Art Vorlage

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

 <procedure>

end

Gibt es eine Möglichkeit, die Erteilung von Ausführungsberechtigungen nur für diese gespeicherte Prozedur einzuschließen, wenn ich gerade dabei bin?
Zum Beispiel wie ...

Grant execute [User_Execute] 

... aber nur für diese gespeicherte Prozedur?

Ich habe einige ähnliche Fragen gesehen, aber anscheinend beziehen sich alle auf ALLE gespeicherten Prozeduren und nicht nur auf eine. Ich habe auch keine gesehen, bei der Sie Berechtigungen innerhalb des create procedureSkripts angeben können . Selbst Antworten darüber, wie ich Berechtigungen ohne die GUI für bestimmte gespeicherte Prozeduren festlegen kann, wären willkommen.

Bearbeiten Die Top-Antwort hat mich auf jeden Fall in die richtige Richtung geführt. Dies ist im Wesentlichen das, wonach ich gesucht habe. Ich habe nicht darüber nachgedacht, die Befehle zu stapeln. Wie auch immer, ich denke, es ist ziemlich schlau.

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

<procedure>

end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO

Der im bearbeiteten Text angegebene Code ist gültig und die richtige Antwort auf diese Frage.
ninty9notout

Antworten:



10

Tabelle abschneiden Das Festlegen von Berechtigungen für Objekte wie gespeicherte Prozeduren kann folgendermaßen erfolgen:

GRANT EXECUTE ON <schema>.<object> to <user>;

Möglicherweise möchten Sie jedoch auch Sicherheitsrechte sowohl auf Anmelde- als auch auf Benutzerebene erteilen. Sie möchten NUR die erforderlichen Rechte für die Objekte festlegen und gewähren, die Zugriff benötigen (z. B. Ausführung). Erwägen Sie die Verwendung der EXECUTE ASFunktion, die das Identitätswechsel eines anderen Benutzers ermöglicht, um Berechtigungen zu validieren, die zum Ausführen des Codes erforderlich sind, ohne alle erforderlichen Rechte für alle zugrunde liegenden Objekte (z. B. Tabellen) erteilen zu müssen. EXECUTE ASkann zu gespeicherten Prozeduren, Funktionen, Triggern usw. hinzugefügt werden

Fügen Sie den Code wie folgt direkt in der gespeicherten Prozedur hinzu:

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

In diesem Fall geben Sie sich als Eigentümer des aufgerufenen Moduls aus. Sie können sich auch als SELBST oder als Benutzer ausgeben, der das Modul erstellt oder ändert, ODER ... imperonate CALLER, wodurch das Modul die Berechtigungen des aktuellen Benutzers übernehmen kann Der Eigentümer der Prozedur mit dem Namen OR ... gibt sich als 'Benutzername' aus, wodurch sich ein bestimmter Benutzer als OR ... gibt sich als 'Anmeldename' mit einem bestimmten Anmeldenamen aus.

In den EXECUTEmeisten Fällen müssen Sie nur Rechte für gespeicherte Prozesse erteilen, und dann werden Rechte für alle Objekte erteilt, auf die im gespeicherten Prozess verwiesen wird.

Auf diese Weise müssen Sie KEINE impliziten Rechte vergeben (Beispiel: Daten aktualisieren oder zusätzliche Prozesse aufrufen). Ownership Chaining übernimmt dies für Sie. Dies ist besonders hilfreich für dynamisches SQL oder wenn Sie Aufgaben mit erhöhter Sicherheit erstellen müssen, z CREATE TABLE. EXECUTE ASist ein nützliches Werkzeug, um dies zu berücksichtigen.

Dieses Beispiel kann all dies verdeutlichen:

Erstellen Sie einen Benutzer namens NoPrivUser mit öffentlichem Zugriff auf eine Datenbank (z. B. dbadb):

USE [master];
GO 
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], 
  CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO 
USE [DBAdb];
GO 
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO

HINWEIS: ERSTELLER ODER BESITZER DIESES VERFAHRENS ERFORDERN TABELLENRECHTE ERSTELLEN in der Zieldatenbank.

use DBAdb 
go 
CREATE PROCEDURE dbo.MyProcedure 
WITH EXECUTE AS OWNER 

truncate table MyTable

GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; 
GO
-- Now log into your database server as NoPrivUser and run the following.

Mit der EXECUTE ASKlausel wird die gespeicherte Prozedur im Kontext des Objektbesitzers ausgeführt. Dieser Code wird erfolgreich erstellt dbo.MyTableund Zeilen werden erfolgreich eingefügt. In diesem Beispiel hat der Benutzer NoPrivUserabsolut keine Berechtigung, die Tabelle zu ändern oder Daten in dieser Tabelle zu lesen oder zu ändern.

Es werden nur die Rechte übernommen, die zum Ausführen dieser bestimmten Aufgabe erforderlich sind, die im Rahmen dieses Verfahrens codiert wurde.

Diese Methode zum Erstellen gespeicherter Prozeduren, die Aufgaben ausführen können, für die erhöhte Sicherheitsrechte erforderlich sind, ohne diese Rechte dauerhaft zuzuweisen, ist sehr nützlich.


4
Dies ist die gleiche Antwort, die Sie gestern auf SO gepostet haben , die ich auch aus Gründen der Lesbarkeit formatieren musste.
Aaron Bertrand

5

Bildbeschreibung hier eingeben

Datenbank-Login auswählen -> Gehen Sie zu Securable und klicken Sie auf die Schaltfläche Suchen wie im vorherigen Bild. Wenn Sie auf die Schaltfläche Suchen klicken, wird das folgende Fenster angezeigt, in dem Sie den Objekttyp hinzufügen können.

Klicken Sie auf die Schaltfläche Objekttypen und Sie erhalten das Fenster "Objekttypen auswählen" mit verschiedenen Objekten. Wenn Sie nun sehen, wird die gespeicherte Prozedur im Bereich Objekttypen aufgelistet. Jetzt wählen wir unsere spezifische gespeicherte Prozedur aus, für die wir die Berechtigung erteilen möchten.


Erstens war die Frage über fünf Jahre alt, als Sie sie beantworteten. Das wäre in Ordnung, außer dass das OP speziell nach Lösungen gefragt hat, die die GUI nicht verwenden und in ein Skript eingebettet werden können. Ihre Antwort geht darauf nicht ein.
Eric Brandt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.