¿Conceder permiso de ejecución para un usuario en todos los procedimientos almacenados en la base de datos?

104

Genere un script de la base de datos anterior, creé una nueva base de datos e importé todos los datos de la base de datos anterior. Sin embargo, hasta ahora todo va bien, ningún usuario tiene derechos de ejecución para procedimientos almacenados. Se que puedo usar

GRANT EXECUTE ON [storedProcName] TO [userName] 

Sin embargo, si fueran solo unos pocos procedimientos, tengo alrededor de 100, entonces, ¿cuál es la forma más fácil de otorgar acceso de ejecución para un usuario específico a todos ellos?

Gracias por adelantado.

Mella
fuente

Respuestas:

115

Cree un rol agregue este rol a los usuarios, y luego podrá otorgar ejecución a todas las rutinas de una sola vez a este rol.

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

EDITAR
Esto funciona en SQL Server 2005, no estoy seguro de la compatibilidad con versiones anteriores de esta función, estoy seguro de que cualquier cosa posterior a 2005 debería estar bien.

Sanjeevakumar Hiremath
fuente
Acabo de probar esto en SQL Server 2008 Standard (amazon RDS) y funcionó como un encanto.
datagod
¿podría dar un ejemplo? digamos que necesito otorgar permisos EJECUTAR en todos los SP para el usuario SPExecuter
Uri Abramson
4
la única otra declaración necesaria es la línea que agrega al usuario al rol, así: ALTER ROLE [abc] ADD MEMBER [user_name]
dhochee
GRANT EXEC TO public
Simon Hughes
27
En realidad, no necesita crear un rol, puede aplicarlo directamente a un usuario, por ejemplo, GRANT EXECUTE TO userName. Creo que esto es suficiente para la pregunta del OP.
Chris Peacock
25

Sin complicar demasiado el problema, para otorgar EJECUTAR en la base de datos elegida:

USE [DB]
GRANT EXEC TO [User_Name];
Bartosz X
fuente
1
funcionó para mí, y presumiblemente cubre todos los procesos almacenados futuros (lo averiguaremos), en lugar de los scripts que nombran cada proceso almacenado.
Ken Forslund
19

Esta es una solución que significa que a medida que agrega nuevos procedimientos almacenados al esquema, los usuarios pueden ejecutarlos sin tener que llamar a grant execute en el nuevo procedimiento almacenado:

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

Referencia: Otorgar permiso de ejecución en todos los procedimientos almacenados

Colin
fuente
6

use el siguiente código, cambie el nombre de la base de datos y el nombre de usuario adecuados y luego tome esa salida y ejecútela en SSMS. PARA SQL 2005 ARRIBA

USE <database_name> 
select 'GRANT EXECUTE ON ['+name+'] TO [userName]  '  
from sys.objects  
where type ='P' 
and is_ms_shipped = 0  
Hemanshu Trivedi
fuente
1
Debe incluir también el tipo 'PC' para incluir los procedimientos almacenados de 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
fuente