EXECUTE की अनुमति को 'xxxxxxx', डेटाबेस 'zzzzzzz', स्कीमा 'dbo' ऑब्जेक्ट पर अस्वीकार कर दिया गया था


187

मुझे किसी फंक्शन को निष्पादित करने में समस्या आ रही है।

यहाँ मैंने क्या किया है:

  1. SQL सर्वर प्रबंधन स्टूडियो का उपयोग करके एक फ़ंक्शन बनाएँ। इसे सफलतापूर्वक बनाया गया था।
  2. मैंने तब नए बनाए गए फंक्शन को अंजाम देने की कोशिश की और यहाँ मुझे जो मिला वह है:

EXECUTE की अनुमति ऑब्जेक्ट 'xxxxxxx', डेटाबेस 'zzzzzzz', स्कीमा 'dbo' पर दी गई थी।


यदि db_owner भूमिका हो, तो उपयोगकर्ता निष्पादित भी कर सकता है (निष्पादन देने के बराबर नहीं ...)
hazjack

मेरे SQL कथन में एक सिंटैक्स त्रुटि होने पर मुझे यह त्रुटि मिली। अनिवार्य रूप से मैं विलीन हो गया था GOऔर Createमें GOCreate। अन्य सिंटैक्स त्रुटियां भी इस त्रुटि को देती हैं।
गणेश कामथ - 'कोड उन्माद'

जवाबों:


162

लगता है जैसे आपको उपयोगकर्ता (या एक समूह जिसे वे का एक हिस्सा है) को निष्पादित प्रक्रिया में विचाराधीन संग्रहीत प्रक्रिया के लिए अनुमति देने की आवश्यकता है।

उदाहरण के लिए, आप इस प्रकार पहुंच प्रदान कर सकते हैं :

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC

2
नमस्ते, मुझे पता है कि यह कुछ समय पहले था, लेकिन मेरे पास एक सवाल है। क्या ऐसी कार्रवाई में कुछ सुरक्षा समस्याएं हो सकती हैं? क्या यह सभी के लिए इस्तेमाल किया जा करने के लिए सपा खोलता है?
वैलेंटाइन वीनोग्रैडस्की

9
हां, यह किसी को भी डीबी के कनेक्शन के साथ संग्रहीत प्रक्रिया को चलाने की अनुमति देता है। मैं उम्मीद करूंगा कि सुरक्षा से चिंतित लोग अपने डेटाबेस में संबंधित समूह तक पहुंच प्रदान करें
रोलैंड शॉ

7
आप GRANT EXEC TO PUBLICडेटाबेस में सभी वस्तुओं तक पहुंच प्रदान करने के लिए भी उपयोग कर सकते हैं
सोहैबी

2
मैं कभी भी सार्वजनिक भूमिका के लिए अनुमति नहीं दूंगा। हमारे पर्यावरण में किसी भी तरह से यह अनिवार्य था कि सार्वजनिक भूमिका को निष्क्रिय कर दिया जाए। मैं हमेशा एक विशिष्ट उपयोगकर्ता को अनुमति निष्पादित करता हूं या इस उद्देश्य के लिए स्पष्ट रूप से बनाई गई भूमिका।
user1161391

4
एक डेटाबेस में कुछ भी निष्पादित करने के लिए PUBLIC को अधिकार देने का सुझाव देने वाली टिप्पणियों को हर कोई क्यों बढ़ा रहा है? यह एक विशेष मामला है डिफैक्टो नहीं।
शनि तिरु

111

सबसे अच्छा समाधान जो मुझे मिला वह एक नई डेटाबेस भूमिका है

CREATE ROLE db_executor;

और फिर उस भूमिका को अनुमति दें।

GRANT EXECUTE TO db_executor;

अब जब आप उपयोगकर्ता के गुणों पर जाते हैं और उपयोगकर्ता मैपिंग पर जाते हैं और उस डेटाबेस का चयन करते हैं जहां आपने नई भूमिका जोड़ी है, तो अब नई भूमिका डेटाबेस भूमिका सदस्यता के लिए दिखाई देगी: अनुभाग

अधिक विस्तार के लिए पूरा लेख पढ़ें


8
यह उत्तर सबसे अच्छा है यदि आपको किसी विशेष उपयोगकर्ता लॉगिन के लिए सभी SPs के लिए EXECUTE देने की आवश्यकता है - बिना सार्वजनिक या db_owner का उपयोग किए। यहाँ सबसे विवेकपूर्ण और उपयोगी उत्तर लगता है।
जुल्म

1
किसी कारण के लिए यह एकमात्र उत्तर है जो SQL Server 2012 पर मेरे लिए काम करता है। मेरे उपयोगकर्ता को स्पष्ट अनुमति देने से काम नहीं चलता है। यह केवल तभी काम करता है जब यह भूमिका के माध्यम से अनुमति प्राप्त करता है।
कीथ

1
इसका उत्तर होना चाहिए। यह मेरे लिए एक आकर्षण की तरह काम करता था। आपका बहुत बहुत धन्यवाद!
शाहबाज़

फिर इसे खाते में जोड़ें जैसेEXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
itmegaMan

72

Sql सर्वर प्रबंधन स्टूडियो में:

बस जाओ security->schema->dbo

डबल क्लिक करें dbo, फिर पर क्लिक करें permission tab->(blue font)view database permissionऔर आवश्यक क्षेत्रों के लिए स्क्रॉल करने के लिए स्वतंत्र महसूस करें जैसे "execute".स्वयं का उपयोग grantया denyनियंत्रण चुनने में मदद करें । आशा है कि यह मदद करेगा :)


52

आपको कुछ इस तरह चलाने की जरूरत है

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user]

4
यह वही था जो मुझे चाहिए था, लेकिन मुझे इसके [domain\user]बजाय करना था'domain\user'
पॉल स्टीफेंसन

45

यदि आप उपयोगकर्ताओं या भूमिकाओं को अनुमति देने की कोशिश कर रहे हैं तो यह काम करेगा।

Microsoft SQL सर्वर प्रबंधन स्टूडियो का उपयोग करना:

  1. पर जाएं: डेटाबेस
  2. Dbo.my_database पर राइट क्लिक करें
  3. चुनें: गुण
  4. बाईं ओर पैनल पर, पर क्लिक करें: अनुमतियाँ
  5. उपयोगकर्ता या भूमिका का चयन करें और नाम पैनल में
  6. अनुमतियों और चेकमार्क में निष्पादित खोजें : अनुदान, अनुदान के साथ, या अस्वीकार करें

दुर्भाग्य से, उपयोगकर्ता ने पहले ही अनुमतियों को निष्पादित कर दिया है! यही कारण है कि यह बहुत भ्रामक है ....
डगलस गास्केल

धन्यवाद कीम यह पूरी तरह से काम कर रहा है जब मैं चेकमार्क अनुदान
रोश

16

ऐसी अनुमति देना खतरनाक हो सकता है, खासकर यदि आपका वेब एप्लिकेशन उसी उपयोगकर्ता नाम का उपयोग करता है।

अब वेब उपयोगकर्ता (और पूरी दुनिया में व्यापक वेब) को भी आपके डेटाबेस के भीतर वस्तुओं को बनाने और छोड़ने की अनुमति है। SQL इंजेक्शन सोचो!

मैं केवल विशिष्ट उपयोगकर्ता को दिए गए ऑब्जेक्ट पर विशेष अधिकार देने की सलाह देता हूं:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

अब उपयोगकर्ता myusernameNoquotes आपके मूल्यवान डेटा पर अन्य अनावश्यक अनुमतियों के बिना प्रक्रिया storeProcedureNameNoquotes निष्पादित कर सकता है।



3

यदि आपके पास समस्या है जैसे कि समाधान निष्पादित होने पर फेंके गए अपवाद के बारे में ऊपर पूछे गए प्रश्न, समस्या अनुमति है, तो उस समूह के उपयोगकर्ताओं को डेटाबेस / संग्रहीत कार्यविधि का उपयोग करने के लिए ठीक से नहीं दी गई है। आपको बस इतना करने की ज़रूरत है कि मेरे पास जो कुछ है, उसे अपने डेटाबेस के नाम, संग्रहीत कार्यविधियों (फ़ंक्शन) और अनुमति या भूमिका के प्रकार या जिसे आप पहुंच प्रदान कर रहे हैं, के साथ प्रतिस्थापित करें।

USE [StableEmployee]
GO
GRANT EXEC ON dbo.GetAllEmployees TO PUBLIC

/ ****** वस्तु: StoredProcedure [dbo]। [GetAllEmployees] स्क्रिप्ट दिनांक: 01/27/2016 16:27:27 ****** /

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[GetAllEmployees]
as
Begin
Select EmployeeId, Name, Gender, City, DepartmentId
From tblEmployee

End

2

आप सभी को अनुमति दे सकते हैं:

GRANT Execute on [dbo].your_object to [public]

"सार्वजनिक" डिफ़ॉल्ट डेटाबेस भूमिका है जो सभी उपयोगकर्ताओं का एक सदस्य है।


1

मैंने उसी समस्या का सामना किया है और मैंने डेटाबेस उपयोगकर्ता को भी db_owner अनुमति देने के रूप में हल किया है।


11
मुझे नहीं लगता कि यह एक अच्छा समाधान है ... क्योंकि मैं अपने वेब एप्लिकेशन को यह अनुमति नहीं दे सकता हूं .. मुझे नहीं पता कि यह वोट किसे देते हैं
मीना गेब्रियल

7
अनुशंसित नहीं है, क्योंकि यह बहुत असुरक्षित है। आपको db_owner का उपयोग करने के बजाय उचित भूमिकाएँ बनानी चाहिए, जिसका पूरे डेटाबेस पर पूरा नियंत्रण है
यतिश

1

यदि आप इस उपयोगकर्ता को किसी विशिष्ट डेटाबेस के लिए विशिष्ट बनाते हैं, तो शायद आप इसे गुणों के "उपयोगकर्ता नाम" में db_owner के रूप में सेट नहीं करते हैं


1

आप सर्वर भूमिकाओं को संशोधित करना बेहतर समझेंगे, जिसे सुरक्षा विशेषाधिकारों के लिए डिज़ाइन किया गया था। अपने उपयोगकर्ता के लिए sysadmin सर्वर भूमिका जोड़ें। बेहतर सुरक्षा के लिए आपके पास अपने कस्टम सर्वर रोल हो सकते हैं। लेकिन यह दृष्टिकोण आपको वही देगा जो आप अभी चाहते हैं।

  1. ऑब्जेक्ट एक्सप्लोरर -> सर्वर -> सुरक्षा -> लॉगिन
  2. अपने इच्छित उपयोगकर्ता पर राइट क्लिक करें
  3. बाईं ओर सर्वर रोल्स पर जाएं
  4. सुनिश्चित करें कि sysadmin की जाँच की गई है
  5. ठीक पर हिट करें और अपने SQL सर्वर को पुनरारंभ करें

सौभाग्य

यहां छवि विवरण दर्ज करें


1
sysadmin कुल ओवरकिल (और खतरनाक) है
Trubs

0

यहां बताया गया है कि कैसे एक उपयोगकर्ता को सार्वजनिक नहीं करने की अनुमति दी जाती है,

प्रत्यक्ष प्रश्न:

Use MyDatabase Grant execute on [dbo].[My-procedures-name] to [IIS APPPOOL\my-iis-pool] Go

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.