उपयोगकर्ता-निर्धारित तालिका प्रकारों पर EXECUTE की अनुमति से इनकार किया जाता है?


87

मेरे पास SQL Server 2008 में उपयोगकर्ता-परिभाषित तालिका प्रकारों के बारे में एक प्रश्न है ।

ASP.NET अनुप्रयोग की आवश्यकता के लिए हमने SQL सर्वर 2008 पर अपने स्वयं के टेबल-प्रकारों को निर्धारित प्रक्रियाओं में पैरामीटर के रूप में उपयोग करने के लिए परिभाषित किया (जब ASP.NET अनुप्रयोग में sql कमांड निष्पादित करते हैं तो हम संग्रहीत प्रक्रिया के लिए पैरामीटर के रूप में DataTable ऑब्जेक्ट को पास करते हैं। एक उदाहरण के लिए यहाँ देखें )

समस्या यह है कि जब हम ASP.NET से Sql कमांड चलाते हैं (संग्रहीत कार्यविधि निष्पादित करते हैं) तो हमें एक त्रुटि मिलती है:

EXECUTE की अनुमति ऑब्जेक्ट 'ourTableType', डेटाबेस 'ourDatabase', स्कीमा 'ourSchema' पर अस्वीकार कर दी गई थी।

ऐसा क्यों हैं? हमें उपयोगकर्ता-परिभाषित तालिका प्रकारों पर अनुमति देने की आवश्यकता क्यों है? केवल संग्रहीत प्रक्रिया पर अनुमति का उपयोग करने के लिए पर्याप्त क्यों नहीं है जो इसका उपयोग करता है? और हम इसे कोई बात नहीं क्या, क्यों कोई है स्थापित करने के लिए करता है, तो EXECUTEजो भी गुण विंडो में सेट करने के लिए अनुमति का प्रकार (मैं केवल देख सकते हैं Control, References, Take Ownership, View Definition)?

मुझे यह भी समझ में नहीं आता है कि Controlगुण विंडो में सेटिंग की समस्या हल करती है और संग्रहीत कार्यविधि समस्याओं के बिना चलती है।



धन्यवाद! मैंने खोजा है, लेकिन स्पष्ट रूप से अच्छा नहीं है: /
जनेज

AS dboआखिर में डालने की कोशिश करें । इस तरह GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo:। मेरे लिए काम किया।
जोनाथन

जवाबों:


197

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

GRANT EXEC ON TYPE::[schema].[typename] TO [User]
GO

9
मेरे 2 सेंट: आपके कनेक्शन प्रमाणीकरण तंत्र के आधार पर, आपको सार्वजनिक समूह को निष्पादन देना पड़ सकता है। GRANT EXEC पर लिखने :: [स्कीमा] [typename] से [लोक] GO: तो अपने अनुदान इस प्रकार दिखाई देगा।
सुधांशु मिश्रा

@dotnetguy आपको बहुत-बहुत धन्यवाद, किसी भी समाधान ने मेरे लिए काम नहीं किया लेकिन आपका।
मेज़न अल सेनिह

3

यदि आपकी संग्रहीत प्रक्रिया गतिशील sql का उपयोग कर रही है, जिसका अर्थ है @sqlकि उत्पन्न होता है और फिर के माध्यम से निष्पादित किया जाता है exec @sql, तो आपको अंतर्निहित तालिकाओं पर दी गई अनुमति की आवश्यकता होगी।

एक काम-के आसपास एक अलग उपयोगकर्ता के रूप में चलाने के लिए संग्रहीत कार्यविधि को संशोधित करना है । यदि आप इसे SELF के रूप में चलाते हैं, तो इसे संग्रहीत खरीद के निर्माता के नीचे चलाया जाएगा, जो बेहद खतरनाक है। फिर भी, यदि आपके पास कोई अन्य विकल्प नहीं है:

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF

1
इसे इंगित करने के लिए Thx। लेकिन संग्रहीत प्रक्रिया में कोई गतिशील एसक्यूएल नहीं होता है। केवल सामान्य INSERT INTOऔर generalUPDATE´ टेबल स्टेटमेंट जिसके लिए इस उपयोगकर्ता के पास सभी अनुमतियाँ हैं जिनकी उसे आवश्यकता है। इसके अलावा यह उपयोगकर्ता / लॉगिन विशेष रूप से आरक्षित है / इस ASP.NET अनुप्रयोग के लिए बनाया गया है जो इस डेटाबेस से जुड़ने में सक्षम है और केवल संग्रहीत प्रक्रियाओं को निष्पादित करता है (नहीं बनाते हैं, आदि, निर्माता हमेशा है 'sa')।
Janez

धन्यवाद, मेरे लिए यही समस्या थी। इस समस्या से अन्य पाठक अधिक युक्तियों के लिए गतिशील SQL के साथ संग्रहीत प्रोक्स पर SQL सर्वर अनुमतियों का उल्लेख कर सकते हैं ।
निकोले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.