web-dev-qa-db-fra.com

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

J'ai généré un script à partir d'une 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'à présent, aucun utilisateur ne dispose de droits d'exécution pour les procédures stockées. Je sais que je peux utiliser

GRANT EXECUTE ON [storedProcName] TO [userName] 

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

Merci d'avance.

95
Nick

Créez un rôle, ajoutez ce rôle aux utilisateurs, puis vous pourrez accorder l'exécution à toutes les routines d'un coup pour 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é ascendante de cette fonctionnalité, je suis sûr qu’une version ultérieure à 2005 ne devrait pas poser de problème.

111

C'est 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 une autorisation d'exécution sur toutes les procédures stockées

17
Colin

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

USE [DB]
GRANT EXEC TO [User_Name];
10
Bartosz X

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

USE <database_name> 
select 'GRANT EXECUTE ON ['+name+'] TO [userName]  '  
from sys.objects  
where type ='P' 
and is_ms_shipped = 0  
5
Hemanshu Trivedi
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
1
GCH