Veritabanındaki tüm saklı yordamlarda bir kullanıcıya yürütme izni verilsin mi?


105

Eski veritabanından komut dosyası oluşturdum, yeni bir veritabanı oluşturdum ve eski veritabanındaki tüm verileri içe aktardım. Şimdiye kadar çok iyi, ancak hiçbir kullanıcının depolanan prosedürleri yürütme hakkı yok. Kullanabileceğimi biliyorum

GRANT EXECUTE ON [storedProcName] TO [userName] 

Bununla birlikte, sadece birkaç prosedür olsaydı, ancak, yaklaşık 100'üm var, bu nedenle, belirli bir kullanıcıya bunların tümüne yürütme erişimi vermenin en kolay yolu nedir?

Şimdiden teşekkürler.

Yanıtlar:


116

Bir rol oluşturun, bu rolü kullanıcılara ekleyin ve ardından bu role tek seferde tüm rutinleri yürütme izni verebilirsiniz.

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

DÜZENLE
Bu, SQL Server 2005'te çalışır, bu özelliğin geriye dönük uyumluluğundan emin değilim, eminim 2005'ten sonraki her şey iyi olacaktır.


Bunu SQL Server 2008 Standard (amazon RDS) üzerinde denedim ve harika çalıştı.
datagod

lütfen bir örnek verebilir misiniz? SPExecuter kullanıcısı için tüm SP'lerde EXECUTE izinleri vermem gerektiğini varsayalım
Uri Abramson

4
gereken diğer tek ifade, kullanıcıyı role ekleyen satırdır, örneğin:
DEĞİŞTİR

HİBE EXEC'İ halka açık
Simon Hughes

27
Aslında bir rol oluşturmanıza gerek yoktur, bunu doğrudan bir kullanıcıya uygulayabilirsiniz, örneğin, userName İÇİN VERİLEN YÜRÜT. Bunun OP'nin sorusu için yeterli olduğunu düşünüyorum.
Chris Peacock

25

Problemi fazla karmaşıklaştırmadan, EXECUTE'u seçilen veri tabanına vermek için:

USE [DB]
GRANT EXEC TO [User_Name];

1
benim için çalıştı ve muhtemelen depolanan her bir proc.proc dosyasını adlandıran komut dosyaları yerine gelecekteki tüm depolanmış işlemleri kapsıyor (bulacağız).
Ken Forslund

19

Bu, şemaya yeni saklı yordamlar eklediğinizde, kullanıcıların yeni saklı yordamda grant execute çağrısı yapmak zorunda kalmadan bunları yürütebileceği anlamına gelen bir çözümdür:

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

Referans: Depolanan Tüm Prosedürlerde Yürütme İzni Verin


6

aşağıdaki kodu kullanın, uygun veritabanı adını ve kullanıcı adını değiştirin ve ardından bu çıktıyı alıp SSMS'de çalıştırın. YUKARIDAKİ SQL 2005 İÇİN

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

1
CLR saklı yordamları dahil etmek için 'PC' türünü de eklemeniz gerekir.
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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.