Concedere l'autorizzazione di esecuzione per un utente su tutte le stored procedure nel database?


104

Ho generato lo script dal vecchio database, creato un nuovo database e importato tutti i dati dal vecchio database. Finora tutto bene, tuttavia, nessun utente ha diritti di esecuzione per le stored procedure. So che posso usare

GRANT EXECUTE ON [storedProcName] TO [userName] 

Se si trattasse di poche procedure, tuttavia, ne ho circa 100, quindi qual è il modo più semplice per concedere l'accesso in esecuzione a un utente specifico a tutte?

Grazie in anticipo.

Risposte:


115

Crea un ruolo, aggiungi questo ruolo agli utenti, quindi puoi concedere l'esecuzione a tutte le routine in un colpo solo a questo ruolo.

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

MODIFICA
Funziona in SQL Server 2005, non sono sicuro della compatibilità con le versioni precedenti di questa funzionalità, sono sicuro che qualsiasi cosa dopo il 2005 dovrebbe andare bene.


Ho appena provato questo su SQL Server 2008 Standard (amazon RDS) e ha funzionato a meraviglia.
datagod

potresti fornire un esempio? diciamo che devo concedere le autorizzazioni EXECUTE su tutti gli SP per l'utente SPExecuter
Uri Abramson

4
l'unica altra istruzione necessaria è la riga che aggiunge l'utente al ruolo, in questo modo: ALTER ROLE [abc] ADD MEMBER [user_name]
dhochee

GRANT EXEC TO public
Simon Hughes

27
In realtà non è necessario creare un ruolo, è possibile applicarlo direttamente a un utente, ad esempio GRANT EXECUTE TO userName. Penso che questo sia sufficiente per la domanda del PO.
Chris Peacock

25

Senza complicare eccessivamente il problema, per garantire l'EXECUTE sul database scelto:

USE [DB]
GRANT EXEC TO [User_Name];

1
ha funzionato per me, e presumibilmente copre tutti i futuri proc memorizzati (lo scopriremo), piuttosto che gli script che nominano ciascun proc memorizzato.
Ken Forslund

19

Questa è una soluzione che significa che quando si aggiungono nuove stored procedure allo schema, gli utenti possono eseguirle senza dover chiamare grant execute sulla nuova stored procedure:

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

Riferimento: concedere l'autorizzazione all'esecuzione per tutte le stored procedure


6

utilizzare il codice seguente, modificare il nome del database e il nome utente corretti, quindi prendere l'output ed eseguire in SSMS. PER SQL 2005 SOPRA

USE <database_name> 
select 'GRANT EXECUTE ON ['+name+'] TO [userName]  '  
from sys.objects  
where type ='P' 
and is_ms_shipped = 0  

1
È necessario includere anche il tipo "PC" per includere le stored procedure CLR.
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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.