"दी गई अनुमति को ऑब्जेक्ट पर अस्वीकार कर दिया गया था" प्राप्त करना भले ही इसे प्रदान किया गया हो


11

मैं एक प्रोग्रामर हूं, डीबीए नहीं ... मुझे पता है कि खतरनाक होना ही काफी है।

मुझे विरासत वाले उपयोगकर्ता के साथ एक डेटाबेस विरासत में मिला है जो डेटाबेस के लिए db_owner है। हम व्यावसायिक कारणों से मौजूदा तालिकाओं, स्कीमा, आदि के लिए इस उपयोगकर्ता की अनुमति को समायोजित नहीं कर सकते हैं, लेकिन कुछ नए तालिकाओं का निर्माण किया जा रहा है, और मैं केवल यही चाहता हूं कि इस उपयोगकर्ता का चयन उन पर हो।

इन तालिकाओं के लिए इस उपयोगकर्ता के लिए अनुमतियां निर्धारित की गई हैं ताकि सब कुछ अस्वीकृत हो जाए, सिवाय चुने के, जो कि GRANT पर सेट है।

फिर भी जब यह उपयोगकर्ता (डबडमिन) इन तालिकाओं में से किसी एक (SELAudit) पर एक चयन करने का प्रयास करता है, तो यह त्रुटि होती है:

The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'.

मैंने इस एसक्यूएल को चलाने की कोशिश की है और यह देखने के लिए कि इस तालिका / उपयोगकर्ता के लिए क्या अनुमतियाँ निर्धारित हैं:

select object_name(major_id) as object,
 user_name(grantee_principal_id) as grantee,
 user_name(grantor_principal_id) as grantor,
 permission_name,
 state_desc
from sys.database_permissions

और यह वही है जो मुझे वापस मिलता है:

AccountingAudit dbadmin dbo ALTER   DENY
AccountingAudit dbadmin dbo CONTROL DENY
AccountingAudit dbadmin dbo DELETE  DENY
AccountingAudit dbadmin dbo INSERT  DENY
AccountingAudit dbadmin dbo REFERENCES  DENY
AccountingAudit dbadmin dbo SELECT  GRANT
AccountingAudit dbadmin dbo TAKE OWNERSHIP  DENY
AccountingAudit dbadmin dbo UPDATE  DENY
AccountingAudit dbadmin dbo VIEW DEFINITION DENY
AccountingAudit dbadmin dbo VIEW CHANGE TRACKING    DENY

ऐसा लगता है कि यह सही काम करना चाहिए?

मैं जो सेलेक्ट कॉल कर रहा हूं वह SSMS के भीतर से एक बहुत ही बेसिक सेलेक्ट * अकाउंटिंग अडिट है। मैं कोई विशेष sp_executesql या ऐसा कुछ नहीं कर रहा हूँ।

मैंने स्पष्ट रूप से अनुमति देने की कोशिश की है:

GRANT SELECT ON [dbo].AccountingAudit TO dbadmin

इसका कोई प्रभाव नहीं है (यह क्यों होगा, पहले से ही ऊपर दी गई क्वेरी यह बताती है!; ;-)

मैंने stackoverflow.com के माध्यम से और अन्य जगहों पर खोज की है, और मुझे अभी तक कोशिश नहीं की गई कुछ भी नहीं मिल सकता है। मुझे आश्चर्य है कि अगर स्कीमा सेटअप के साथ कुछ करना है। (इस बिंदु पर मैं स्कीमा के बारे में बहुत कम जानता हूं।)

कोई विचार? धन्यवाद!

जवाबों:


10

मुझे यहां यकीन नहीं है, लेकिन मैं एक अंग पर बाहर जाने वाला हूं। मुझे लगता है कि आपका मुद्दा आपके DENY CONTROLरिकॉर्ड के साथ हो सकता है । पेज के आधे रास्ते के बारे में यहां देखें :

किसी डेटाबेस पर नियंत्रण की अनुमति देना स्पष्ट रूप से डेटाबेस पर CONNECT अनुमति से इनकार करता है। एक प्रिंसिपल जो किसी डेटाबेस पर नियंत्रण की अनुमति से वंचित है, उस डेटाबेस से कनेक्ट नहीं हो पाएगा।

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

यदि ऐसा है, तो आपको उपयोगकर्ता को डेटाबेस भूमिका में रखना होगा या उन्हें तालिका के विरुद्ध स्पष्ट विशेषाधिकार से वंचित करना होगा।


1
धन्यवाद! प्रारंभ में मेरे प्रयोग में मुझे पता चला कि यदि नियंत्रण को अस्वीकार नहीं किया गया था, तो वे चयन कर सकते हैं। लेकिन BOL को पढ़ने में मैंने इसका गलत अर्थ निकाला था कि मैं उपयोगकर्ता को तालिका पर पूर्ण नियंत्रण दे रहा था। अब मैं देखता हूं कि जब तक मैं उन्हें नियंत्रित नहीं करता हूं, तब तक मैं अन्य अनुमतियों (INSERT, DELETE, आदि) को DENY स्तर पर रख सकता हूं, और मुझे जो अनुमति स्तर चाहिए उन्हें प्राप्त कर सकते हैं। धन्यवाद!
मेसन जी। ज़्विती

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

0
  1. sp_DBPermissionsअनुमतियों को देखने के लिए केन फिशर की संग्रहीत प्रक्रिया का उपयोग करें ।

    1. मेक यकीन है कि DENY CONTROLआम के अलावा तालिका करने के लिए लागू नहीं है, DENY SELECT, DENY INSERT, DENY UPDATE, DENY DELETEऔर DENY REFERENCES
    2. यदि SELECTकथन में तालिका-मूल्यवान फ़ंक्शन हैं, तो सुनिश्चित करें कि या तो EXECUTE AS OWNERटेबल-वैल्यू फ़ंक्शन पर है या उस GRANT EXECUTEपर (और नहीं DENY EXECUTE)। यदि यह स्थिति है, तो त्रुटि संदेश को और अधिक ध्यान से पढ़ें क्योंकि यह संभावना नहीं होगी कि मेज पर SELECT अनुमति से इनकार किया गया था, लेकिन इसके बजाय EXECUTE से इनकार किया जा रहा है।
  2. यदि उपयोगकर्ता AD उपयोगकर्ता या समूह है, तो उपयोगकर्ता को निर्धारित करने के लिए निम्न स्क्रिप्ट का उपयोग करें login_token:

EXECUTE AS LOGIN = 'EXAMPLEDOMAIN\JOHN.DOE';
SELECT * FROM sys.login_token;
REVERT;
  1. वास्तविक निष्पादन योजना को देखें। यदि त्रुटि एक संग्रहीत कार्यविधि के साथ है SET NOCOUNT ON;, तो वास्तविक निष्पादन योजना आपको जानकारी देगी कि आप SSMS में केवल संदेश टैब को देखकर ध्यान नहीं दे सकते हैं, क्योंकि "पंक्तियाँ प्रभावित" आपके नियंत्रण से बाहर हो सकती हैं।

    1. ट्रिगर्स या लौकिक तालिकाओं के लिए देखें।
  2. आप कथन को संग्रहीत कार्यविधि और SSMS "ऑब्जेक्ट ऑब्जेक्ट निर्भरता" के रूप में संकलित कर सकते हैं, साथ ही SQL Server ऑब्जेक्ट निर्भरता को खोजने के लिए अलग-अलग तरीकों से स्वेतलाना गोलोव्को द्वारा उल्लिखित चालें।

  3. SQL सर्वर प्रोफाइलर सुरक्षा इवेंट "ऑडिट स्कीमा ऑब्जेक्ट एक्सेस इवेंट" और कॉलम "TextData" और "सफलता" का उपयोग करें यह ट्रैक करने के लिए कि कौन सी ऑब्जेक्ट SQL सर्वर अनुमतियों का मूल्यांकन कर रहा है। - मैंने ऐसी स्थितियों को देखा है जहां इस घटना के लिए दो पंक्तियाँ उत्सर्जित होती हैं, और एक मान सफलता = 1 कहता है और दूसरा कहता है सफलता = 0। इस परिदृश्य में, मेरे पास काम करने के लिए एकमात्र समाधान सर्वर को रिबूट करना है। यहां तक ​​कि रनिंग repadmin /syncallने भी समस्या को ठीक नहीं किया, न ही आवेदन शुरू किया और रोक दिया (और इसलिए कनेक्शन पूल)।

  4. लॉगिन के लिए प्रभावी अनुमति निर्धारित करें:

-- '<domain>\<username>' is a domain user in the group you wish to test
EXECUTE AS LOGIN = '<domain>\<username>';
SELECT * FROM fn_my_permissions('Database.Schema.Table', 'OBJECT');
REVERT;
  1. यदि उपयोगकर्ता AD उपयोगकर्ता या समूह से जुड़ा हुआ है, तो repadmin /syncallअपने डोमेन नियंत्रकों में सिंक करने के लिए सक्रिय निर्देशिका में किए गए किसी भी परिवर्तन को लागू करने के लिए दौड़ने पर विचार करें। - अगर किसी को दो डोमेन नियंत्रकों के वर्तमान मूल्यों की तुलना करने का एक अच्छा तरीका पता है, तो कृपया मुझे बताएं।

  2. पूरे सिस्टम के हार्ड रिबूट पर विचार करने से पहले, उस उपयोगकर्ता के सभी सक्रिय कनेक्शनों को मारने का प्रयास करें। कारण यह है कि उपयोगकर्ता को डीसी से अपने विंडोज़ टोकन मिलते हैं जिसमें उनके समूह शामिल होते हैं। जब तक उपयोगकर्ता को एक नया टोकन नहीं मिल जाता है, तब तक टोकन अपडेट नहीं किया जाएगा - आमतौर पर लॉग ऑफ करके और फिर लॉग ऑन करके।

  3. सिस्टम को हार्ड रिबूट करें। इसने मेरे लिए काम किया। अभी भी 100% निश्चित नहीं है कि अभी तक क्यों। केवल अगर आप समय बर्बाद कर सकते हैं तो यह मत करो! इस कारनामे के बारे में आपको पता चलता है कि आप कितने बड़े परिवहन हैं!

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