Ausführungsberechtigung für einen Benutzer für alle gespeicherten Prozeduren in der Datenbank erteilen?

103

Ich habe ein Skript aus einer alten Datenbank generiert, eine neue Datenbank erstellt und alle Daten aus einer alten Datenbank importiert. Bisher hat jedoch kein Benutzer Ausführungsrechte für gespeicherte Prozeduren. Ich weiß, dass ich verwenden kann

GRANT EXECUTE ON [storedProcName] TO [userName] 

Wenn es nur ein paar Prozeduren waren, habe ich ungefähr 100, also was ist der einfachste Weg für mich, allen einen Ausführungszugriff für einen bestimmten Benutzer zu gewähren?

Danke im Voraus.

Nick
quelle

Antworten:

114

Erstellen Sie eine Rolle. Fügen Sie diese Rolle den Benutzern hinzu. Anschließend können Sie dieser Rolle allen Routinen auf einmal die Ausführung gewähren.

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

BEARBEITEN
Dies funktioniert in SQL Server 2005. Ich bin mir nicht sicher, ob diese Funktion abwärtskompatibel ist. Ich bin mir sicher, dass etwas später als 2005 in Ordnung sein sollte.

Sanjeevakumar Hiremath
quelle
Ich habe es gerade mit SQL Server 2008 Standard (Amazon RDS) versucht und es hat wie ein Zauber funktioniert.
Datum
Könnten Sie bitte ein Beispiel geben? Nehmen wir an, ich muss EXECUTE-Berechtigungen für alle SPs für den Benutzer SPExecuter
Uri Abramson am
4
Die einzige andere Anweisung, die benötigt wird, ist die Zeile, die den Benutzer zur Rolle hinzufügt, wie folgt: ALTER ROLE [abc] ADD MEMBER [Benutzername]
dhochee
GRANT EXEC TO public
Simon Hughes
27
Sie müssen keine Rolle erstellen, sondern können diese direkt auf einen Benutzer anwenden, z. B. GRANT EXECUTE TO userName. Ich denke, das reicht für die Frage des OP aus.
Chris Peacock
24

Um das Problem zu komplizieren, können Sie EXECUTE für die ausgewählte Datenbank gewähren:

USE [DB]
GRANT EXEC TO [User_Name];
Bartosz X.
quelle
1
hat für mich gearbeitet und deckt vermutlich alle zukünftigen gespeicherten Prozesse ab (wir werden es herausfinden), anstatt Skripte, die jeden gespeicherten Prozess benennen.
Ken Forslund
18

Dies ist eine Lösung, die bedeutet, dass Benutzer beim Hinzufügen neuer gespeicherter Prozeduren zum Schema diese ausführen können, ohne Grant Execute für die neue gespeicherte Prozedur aufrufen zu müssen:

IF  EXISTS (SELECT * FROM sys.database_principals WHERE name = N'asp_net')
DROP USER asp_net
GO

IF  EXISTS (SELECT * FROM sys.database_principals 
WHERE name = N'db_execproc' AND type = 'R')
DROP ROLE [db_execproc]
GO

--Create a database role....
CREATE ROLE [db_execproc] AUTHORIZATION [dbo]
GO

--...with EXECUTE permission at the schema level...
GRANT EXECUTE ON SCHEMA::dbo TO db_execproc;
GO

--http://www.patrickkeisler.com/2012/10/grant-execute-permission-on-all-stored.html
--Any stored procedures that are created in the dbo schema can be 
--executed by users who are members of the db_execproc database role

--...add a user e.g. for the NETWORK SERVICE login that asp.net uses
CREATE USER asp_net 
FOR LOGIN [NT AUTHORITY\NETWORK SERVICE] 
WITH DEFAULT_SCHEMA=[dbo]
GO

--...and add them to the roles you need
EXEC sp_addrolemember N'db_execproc', 'asp_net';
EXEC sp_addrolemember N'db_datareader', 'asp_net';
EXEC sp_addrolemember N'db_datawriter', 'asp_net';
GO

Referenz: Erteilen Sie die Ausführungsberechtigung für alle gespeicherten Prozeduren

Colin
quelle
6

Verwenden Sie den folgenden Code, ändern Sie den richtigen Datenbanknamen und Benutzernamen und nehmen Sie diese Ausgabe und führen Sie sie in SSMS aus. FÜR SQL 2005 OBEN

USE <database_name> 
select 'GRANT EXECUTE ON ['+name+'] TO [userName]  '  
from sys.objects  
where type ='P' 
and is_ms_shipped = 0  
Hemanshu Trivedi
quelle
1
Sie müssen auch den Typ 'PC' angeben, um gespeicherte CLR-Prozeduren einzuschließen.
Oleh Nechytailo
1
USE [DATABASE]

DECLARE @USERNAME VARCHAR(500)

DECLARE @STRSQL NVARCHAR(MAX)

SET @USERNAME='[USERNAME] '
SET @STRSQL=''

select @STRSQL+=CHAR(13)+'GRANT EXECUTE ON ['+ s.name+'].['+obj.name+'] TO'+@USERNAME+';'
from
    sys.all_objects as obj
inner join
    sys.schemas s ON obj.schema_id = s.schema_id
where obj.type in ('P','V','FK')
AND s.NAME NOT IN ('SYS','INFORMATION_SCHEMA')


EXEC SP_EXECUTESQL @STRSQL
GCH
quelle