Предоставить пользователю разрешение на выполнение всех хранимых процедур в базе данных?


105

Я сгенерировал сценарий из старой базы данных, создал новую базу данных и импортировал все данные из старой базы данных. Однако пока все хорошо, ни один пользователь не имеет прав на выполнение хранимых процедур. Я знаю, что могу использовать

GRANT EXECUTE ON [storedProcName] TO [userName] 

Однако, если бы это было всего несколько процедур, у меня их около 100, так как мне проще всего предоставить доступ на выполнение конкретному пользователю для всех из них?

Заранее спасибо.

Ответы:


116

Создайте роль, добавьте эту роль пользователям, а затем вы можете разрешить выполнение всех подпрограмм за один раз для этой роли.

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

ИЗМЕНИТЬ
Это работает в SQL Server 2005, я не уверен в обратной совместимости этой функции, я уверен, что все, что позже, чем 2005, должно быть в порядке.


Я просто попробовал это на SQL Server 2008 Standard (Amazon RDS), и это сработало как шарм.
datagod 05

не могли бы вы привести пример? Допустим, мне нужно предоставить разрешения EXECUTE для всех SP пользователю SPExecuter
Ури Абрамсон

4
единственный другой необходимый оператор - это строка, добавляющая пользователя к роли, например: ALTER ROLE [abc] ADD MEMBER [user_name]
dhochee

GRANT EXEC TO public
Саймон Хьюз

27
На самом деле вам не нужно создавать роль, вы можете применить ее непосредственно к пользователю, например GRANT EXECUTE TO userName. Я думаю, что этого достаточно для вопроса ОП.
Крис Пикок,

25

Не усложняя проблему, чтобы предоставить EXECUTE для выбранной базы данных:

USE [DB]
GRANT EXEC TO [User_Name];

1
работал у меня и, по-видимому, охватывает все будущие сохраненные процедуры (мы узнаем), а не сценарии, которые называют каждую сохраненную процедуру.
Ken Forslund

19

Это решение, которое означает, что по мере добавления новых хранимых процедур в схему пользователи могут выполнять их, не вызывая grant execute для новой хранимой процедуры:

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

Ссылка: Предоставление разрешения на выполнение для всех хранимых процедур


6

используйте приведенный ниже код, измените правильное имя базы данных и имя пользователя, а затем возьмите этот вывод и выполните в SSMS. ДЛЯ SQL 2005 ВЫШЕ

USE <database_name> 
select 'GRANT EXECUTE ON ['+name+'] TO [userName]  '  
from sys.objects  
where type ='P' 
and is_ms_shipped = 0  

1
Вам необходимо также указать тип «ПК», чтобы включить хранимые процедуры 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'+@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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.