डेटाबेस में सभी संग्रहीत प्रक्रियाओं पर एक उपयोगकर्ता के लिए अनुमति निष्पादित करें?


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) पर यह कोशिश की और यह एक आकर्षण की तरह काम करता है।
दतागोड़

क्या आप कृपया एक उदाहरण प्रदान कर सकते हैं? बता दें कि मुझे SP SPececuter के लिए सभी SP के लिए EXECUTE की अनुमति देने की आवश्यकता है
Uri Abramson

4
केवल दूसरे कथन की आवश्यकता है जो उपयोगकर्ता को भूमिका में जोड़ने वाली रेखा है, जैसे: ALTER ROLE [abc] ADD
प्रोफाइल

सार्वजनिक रूप से एक्सप्रेस
साइमन ह्यूज

27
आपको वास्तव में एक भूमिका बनाने की आवश्यकता नहीं है, आप इसे सीधे उपयोगकर्ता के लिए लागू कर सकते हैं, उदाहरण के लिए उपयोगकर्ता नाम के लिए अनुदान। मुझे लगता है कि यह ओपी के सवाल के लिए पर्याप्त है।
क्रिस मोर

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 ABOVE के लिए

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

1
सीएलआर संग्रहित प्रक्रियाओं को शामिल करने के लिए आपको 'पीसी' प्रकार भी शामिल करना होगा।
ओलेह नेचिटेलियो

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.