Accorder l'autorisation d'exécution à un utilisateur sur toutes les procédures stockées dans la base de données?

104

J'ai généré un script à partir de l'ancienne base de données, créé une nouvelle base de données et importé toutes les données de l'ancienne base de données. Jusqu'ici tout va bien, cependant, aucun utilisateur n'a les droits d'exécution pour les procédures stockées. Je sais que je peux utiliser

GRANT EXECUTE ON [storedProcName] TO [userName] 

S'il ne s'agissait que de quelques procédures, cependant, j'en ai environ 100, alors quel est le moyen le plus simple pour moi d'accorder l'accès d'exécution à un utilisateur spécifique à tous?

Merci d'avance.

pseudo
la source

Réponses:

115

Créez un rôle, ajoutez ce rôle aux utilisateurs, puis vous pouvez accorder une exécution à toutes les routines en une seule fois à ce rôle.

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

EDIT
Cela fonctionne dans SQL Server 2005, je ne suis pas sûr de la compatibilité descendante de cette fonctionnalité, je suis sûr que tout ce qui est postérieur à 2005 devrait bien se passer.

Sanjeevakumar Hiremath
la source
Je viens de l'essayer sur SQL Server 2008 Standard (amazon RDS) et cela a fonctionné à merveille.
datagod
pouvez-vous donner un exemple? disons que je dois accorder des autorisations EXECUTE sur tous les SP pour l'utilisateur SPExecuter
Uri Abramson
4
la seule autre instruction nécessaire est la ligne ajoutant l'utilisateur au rôle, comme ceci: ALTER ROLE [abc] ADD MEMBER [user_name]
dhochee
GRANT EXEC TO public
Simon Hughes
27
Vous n'avez pas réellement besoin de créer un rôle, vous pouvez l'appliquer directement à un utilisateur, par exemple GRANT EXECUTE TO userName. Je pense que c'est suffisant pour la question du PO.
Chris Peacock
25

Sans trop compliquer le problème, pour accorder EXECUTE sur la base de données choisie:

USE [DB]
GRANT EXEC TO [User_Name];
Bartosz X
la source
1
a fonctionné pour moi, et couvre probablement tous les futurs procs stockés (nous le découvrirons), plutôt que les scripts qui nomment chaque proc stocké.
Ken Forslund
19

Il s'agit d'une solution qui signifie que lorsque vous ajoutez de nouvelles procédures stockées au schéma, les utilisateurs peuvent les exécuter sans avoir à appeler grant execute sur la nouvelle procédure stockée:

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

Référence: Accorder l'autorisation d'exécution sur toutes les procédures stockées

Colin
la source
6

utilisez le code ci-dessous, modifiez le nom de la base de données et le nom d'utilisateur appropriés, puis prenez cette sortie et exécutez-la dans SSMS. POUR SQL 2005 CI-DESSUS

USE <database_name> 
select 'GRANT EXECUTE ON ['+name+'] TO [userName]  '  
from sys.objects  
where type ='P' 
and is_ms_shipped = 0  
Hemanshu Trivedi
la source
1
Vous devez également inclure le type «PC» pour inclure les procédures stockées 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
GCH
la source