2011-03-25 13 views
67

I generados por el script de base de datos antigua, crearon una nueva base de datos e importado todos los datos de la base de datos de edad. Hasta ahora todo bien, sin embargo, ningún usuario tiene derechos de ejecución para procedimientos almacenados. Sé que puedo usar¿Otorgar permiso de ejecución para un usuario en todos los procedimientos almacenados en la base de datos?

GRANT EXECUTE ON [storedProcName] TO [userName] 

si era sólo un par de procedimientos, sin embargo, tengo alrededor de 100 ¿cuál es la forma más fácil para mí para conceder acceso de ejecución para un usuario específico a todos ellos?

Gracias de antemano.

Respuesta

80

crea una función de añadir esta función a los usuarios, y entonces usted puede conceder a ejecutar todas las rutinas de una sola vez a esta función.

CREATE ROLE <abc> 
GRANT EXECUTE TO <abc> 

EDITAR
Esto funciona en SQL Server 2005, no estoy seguro acerca de la compatibilidad de esta característica, estoy seguro de nada más tardar en 2005 debe estar bien.

+0

Acabo de intentar esto en SQL Server 2008 Standard (Amazon RDS) y funcionó como un encanto. – datagod

+0

¿podría darnos un ejemplo? Digamos que necesito para conceder permisos de ejecución todas las de SP para el SPExecuter usuario –

+4

la única otra declaración que se necesita es la línea de añadir el usuario a la función, así: ALTER PAPEL [ABC] Agregar miembro [nombre_usuario] EXEC – dhochee

4

utilizar por debajo de código, cambie el nombre de base de datos adecuada y el nombre de usuario y luego tomar esa salida y ejecutar 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 
+1

Debe incluir también el tipo de 'PC' para incluir los procedimientos almacenados de CLR. –

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'[email protected]+';' 
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 
13

Esta es una solución que significa que a medida que agrega nuevos procedimientos almacenados para el esquema, los usuarios pueden ejecutar sin tener que llamar subvención ejecutar sobre 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: Grant Execute Permission on All Stored Procedures

1

Sin complicar el problema, conceder la EXECUTE sobre la base de datos elegida:

USE [DB] 
GRANT EXEC TO [User_Name]; 
Cuestiones relacionadas