संग्रहीत प्रक्रियाओं को निष्पादित करने की अनुमति कैसे दें लेकिन लिखते नहीं हैं?


11

मैं अपने SQL Server 2012 उदाहरण पर एक "रीडिंग" उपयोगकर्ता सेट करना चाहूंगा। मैं उसे किसी भी संग्रहीत कार्यविधि, या फ़ंक्शन, या प्रत्यक्ष SQL कथन को निष्पादित करने का अधिकार देना चाहूंगा, जो सभी तालिकाओं और विचारों से डेटा को पुनर्प्राप्त करता है, लेकिन अद्यतन करने या सम्मिलित करने के लिए नहीं (यानी कुछ भी पढ़ें और कुछ भी न लिखें)।

क्या मैं इसे विशेष रूप से प्रत्येक फ़ंक्शन या नाम द्वारा संग्रहीत प्रक्रिया के अधिकार दिए बिना सेट कर सकता हूं, लेकिन उसे किसी भी फ़ंक्शन या संग्रहीत कार्यविधि पर निष्पादन का अधिकार देता हूं, बस तालिकाओं को संशोधित करने का अधिकार छीन लेता हूं?

अगर मैं इसके बजाय SQL Server 2008 चलाऊ तो ​​क्या कुछ बदल जाएगा?

स्पष्टीकरण और परिवर्धन:

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

मैं यहां नया हूं, कृपया बेझिझक टैग्स को उपयुक्त रूप से सेट करें और अन्यथा प्रश्न को संपादित करने के लिए
gt6989b

1
@ क्रिसगुटेमेयर ने सोचा था कि - वह इसे निष्पादित कर सकता है लेकिन इसके परिणामस्वरूप किसी प्रकार की त्रुटि होगी; वैकल्पिक रूप से मैं ठीक हूं कि उसे निष्पादित करने की अनुमति नहीं है, जब तक कि मुझे स्प की एक सूची निर्दिष्ट करने की आवश्यकता नहीं है, उसे चलाने के लिए विशेषाधिकार हैं
gt6989b

1
उस स्थिति में आपको SQL सर्वर अनुमतियों के बारे में पढ़ने की आवश्यकता है। अनुमति GRANTदेने के DENYलिए , अनुमति देने से इनकार करने और या REVOKEहटाने के लिए 3 अनुमति संस्करण हैं । बिना या उपयोगकर्ता अनुमतियाँ इनहेरिट कर सकते हैं, संग्रहीत कार्यविधि तक पहुँच प्राप्त करने से कह सकते हैं। GRANTDENYGRANTDENY
जेएनके

1
@ gt6989b यदि आप DENY DELETE, INSERT, UPDATEकिसी डेटाबेस या स्कीमा पर हैं, तो मेरा मानना ​​है कि यह केवल तालिकाओं और विचारों को प्रभावित करेगा।
जेएनके

1
@ gt6989b - सिर्फ यह देखते हुए कि इन टिप्पणियों में सुझाए गए उत्तर गलत थे। पॉल व्हाइट की प्रतिक्रिया देखें।
आरएलएफ

जवाबों:


15

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

-- The user-defined role containing all required permissions
CREATE ROLE Readers AUTHORIZATION dbo;

-- Give read-only access to all tables,
-- views on those tables, and in-line
-- functions
ALTER ROLE db_datareader ADD MEMBER Readers;

-- Example: add a user (Bob) to the role
ALTER ROLE Readers ADD MEMBER Bob;

इसके बाद, बॉब के डेटाबेस में व्यापक रीड-ओनली विशेषाधिकार होंगे। वह सभी तालिकाओं, उन तालिकाओं के विचारों और इन-लाइन कार्यों से पढ़ सकेगा। हालांकि, वह किसी भी प्रक्रिया को निष्पादित करने या गैर-इनलाइन कार्यों का उपयोग करने में सक्षम नहीं होगा।

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

एक बात का ध्यान रखें कि डेटा संशोधन विशेषाधिकारों की कमी से एक पाठक को संग्रहीत प्रक्रिया के माध्यम से डेटा को बदलने से नहीं रोका जा सकेगा, अगर उसे प्रक्रिया और ऑब्जेक्ट को संशोधित करने की अनुमति दी गई है, तो एक आम मालिक साझा करता है। न ही इस मामले में स्पष्ट इनकार किया जाएगा। इस सुविधा को स्वामित्व चैनिंग के रूप में जाना जाता है ।

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