Надати дозвіл користувачеві на всі збережені процедури в базі даних?


104

Я генерував сценарій зі старої бази даних, створив нову базу даних та імпортував усі дані зі старої бази даних. Поки що добре, проте жоден користувач не виконує прав на збережені процедури. Я знаю, що можу використовувати

GRANT EXECUTE ON [storedProcName] TO [userName] 

Якщо це було лише кілька процедур, я маю близько 100, тож який найпростіший спосіб мені надати доступ до певного користувача для кожного з них?

Заздалегідь спасибі.

Відповіді:


115

Створіть роль, додайте цю роль користувачам, і тоді ви можете дозволити виконувати всі підпрограми за один кадр до цієї ролі.

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

EDIT
Це працює в SQL Server 2005, я не впевнений у звороті сумісності цієї функції, я впевнений, що все, що пізніше 2005 року, повинно бути добре.


Я тільки що спробував це на SQL Server 2008 Standard (Amazon RDS), і це спрацювало як шарм.
datagod

Ви можете надати приклад? скажемо, що мені потрібно надати EXECUTE дозволи на всі SP для користувача SPExecuter
Урі Абрамсон

4
єдиний інший необхідний вислів - це рядок, що додає користувача до ролі, наприклад: ALTER ROLE [abc] ADD MEMBER [user_name]
dhochee

ВИДАЙТЕ ДЛЯ громадськості
Саймон Х'юз

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

25

Не надто ускладнюючи проблему, надайте ВИКОНАННЯ на обрану базу даних:

USE [DB]
GRANT EXEC TO [User_Name];

1
працював для мене і, ймовірно, охоплює всі майбутні збережені програми (ми дізнаємось), а не скрипти, які називають кожну збережену процедуру.
Кен Форслунд

19

Це рішення, яке означає, що під час додавання нових збережених процедур до схеми користувачі можуть виконувати їх без необхідності виклику виконання гранту в новій збереженій процедурі:

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.