Conceder permissão de execução para um usuário em todos os procedimentos armazenados no banco de dados?

104

Eu gerei o script do banco de dados antigo, criei um novo banco de dados e importei todos os dados do banco de dados antigo. Até agora tudo bem, no entanto, nenhum usuário tem direitos de execução para procedimentos armazenados. Eu sei que posso usar

GRANT EXECUTE ON [storedProcName] TO [userName] 

Se fossem apenas alguns procedimentos, no entanto, eu tenho cerca de 100, então qual é a maneira mais fácil de conceder acesso de execução para um usuário específico a todos eles?

Desde já, obrigado.

usuario
fonte

Respostas:

115

Crie uma função, adicione esta função aos usuários e, em seguida, você pode conceder a execução a todas as rotinas de uma vez para essa função.

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

EDITAR
Isso funciona no SQL Server 2005, não tenho certeza sobre a compatibilidade com versões anteriores desse recurso, tenho certeza que qualquer coisa posterior a 2005 deve estar bem.

Sanjeevakumar Hiremath
fonte
Eu tentei isso no SQL Server 2008 Standard (Amazon RDS) e funcionou como um encanto.
datagod
você poderia dar um exemplo? Digamos que eu preciso conceder permissões EXECUTE em todos os SPs para o usuário SPExecuter
Uri Abramson
4
a única outra instrução necessária é a linha adicionando o usuário à função, assim: ALTER ROLE [abc] ADD MEMBER [user_name]
dhochee
GRANT EXEC TO público
Simon Hughes,
27
Na verdade, você não precisa criar uma função, você pode aplicá-la diretamente a um usuário, por exemplo, GRANT EXECUTE TO userName. Acho que isso é suficiente para a pergunta do OP.
Chris Peacock
25

Sem complicar demais o problema, para conceder EXECUTE no banco de dados escolhido:

USE [DB]
GRANT EXEC TO [User_Name];
Bartosz X
fonte
1
funcionou para mim e presumivelmente cobre todos os procs armazenados futuros (nós descobriremos), ao invés de scripts que nomeiam cada proc armazenado.
Ken Forslund
19

Esta é uma solução que significa que, conforme você adiciona novos procedimentos armazenados ao esquema, os usuários podem executá-los sem ter que chamar grant execute no novo procedimento armazenado:

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

Referência: Conceda permissão de execução em todos os procedimentos armazenados

Colin
fonte
6

use o código abaixo, altere o nome do banco de dados e o nome de usuário adequados e, em seguida, pegue essa saída e execute no SSMS. PARA SQL 2005 ACIMA

USE <database_name> 
select 'GRANT EXECUTE ON ['+name+'] TO [userName]  '  
from sys.objects  
where type ='P' 
and is_ms_shipped = 0  
Hemanshu Trivedi
fonte
1
Você precisa incluir também o tipo 'PC' para incluir os procedimentos armazenados CLR.
Oleh Nechytailo de
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
fonte