मुझे डर है कि या तो आपका विवरण या स्वामित्व श्रृखंला के बारे में आपकी अवधारणा अस्पष्ट है, तो मुझे इसके साथ शुरू करने दें:
"स्वामित्व श्रृंखला" केवल इस तथ्य को संदर्भित करता है कि SQL सर्वर पर संग्रहीत प्रक्रिया (या दृश्य) निष्पादित करते समय, वर्तमान में निष्पादित बैच अस्थायी रूप से उस SQL कोड को निष्पादित करते समय sProc के स्वामी (या sProc के स्कीमा के स्वामी) के अधिकार/अनुमतियां प्राप्त करता है। तो एक sProc के मामले में, उपयोगकर्ता उन निजी का उपयोग कुछ भी करने के लिए नहीं कर सकता है जो उनके लिए sProc कोड लागू नहीं करता है। विशेष रूप से ध्यान दें कि यह कभी भी पहचान प्राप्त नहीं करता है स्वामी के, केवल उसके अधिकार, अस्थायी रूप से (हालाँकि, EXECUTE AS... ऐसा करता है)।
तो सुरक्षा के लिए इसका लाभ उठाने का सामान्य तरीका यह है:
-
सभी डेटा टेबल्स (और सभी गैर-सुरक्षा दृश्य भी) को अपनी स्कीमा में रखें, आइए इसे [डेटा] कहते हैं (हालांकि आमतौर पर [डीबीओ] का उपयोग किया जाता है क्योंकि यह पहले से ही है और उपयोगकर्ता की स्कीमा के लिए बहुत विशेषाधिकार प्राप्त है)। सुनिश्चित करें कि किसी भी मौजूदा उपयोगकर्ता, स्कीमा या स्वामी के पास इस [डेटा] स्कीमा तक पहुंच नहीं है।
-
सभी sProcs (और/या संभवतः किसी भी सुरक्षा दृश्य) के लिए [exec] नामक एक स्कीमा बनाएं। सुनिश्चित करें कि इस स्कीमा के स्वामी के पास [डेटा] स्कीमा तक पहुंच है (यदि आप dbo को इस स्कीमा का स्वामी बनाते हैं तो यह आसान है)।
-
"उपयोगकर्ता" नामक एक नई डीबी-भूमिका बनाएं और इसे [निष्पादन] स्कीमा तक पहुंच प्रदान करें। अब सभी यूजर्स को इस रोल में जोड़ें। सुनिश्चित करें कि आपके उपयोगकर्ताओं के पास केवल कनेक्ट अधिकार हैं और उन्हें [dbo] सहित किसी अन्य स्कीमा तक पहुंच प्रदान नहीं की गई है।
अब आपके उपयोगकर्ता केवल [exec] में sProcs निष्पादित करके डेटा तक पहुंच सकते हैं। वे किसी अन्य डेटा तक नहीं पहुंच सकते हैं या किसी अन्य ऑब्जेक्ट को निष्पादित नहीं कर सकते हैं।
मुझे यकीन नहीं है कि यह आपके प्रश्न का उत्तर देता है (क्योंकि मैं अनिश्चित था कि प्रश्न वास्तव में क्या था), इसलिए बेझिझक मुझे पुनर्निर्देशित करें।
जहां तक पंक्ति-स्तरीय सुरक्षा का सवाल है, मैं इसे हमेशा ऊपर दी गई सुरक्षा योजना के साथ कैसे करता हूं:
-
मैं हमेशा पंक्ति-स्तरीय सुरक्षा को दृश्यों की एक श्रृंखला के रूप में लागू करता हूं जो प्रत्येक तालिका को मिरर-रैप करता है और उपयोगकर्ता की पहचान (आमतौर पर Suuser_Sname() या अन्य में से एक के साथ) की तुलना पंक्ति में सुरक्षा कोड से की गई सुरक्षा सूची में करता है। ये सुरक्षा-दृश्य हैं।
-
[पंक्तियों] नामक एक नई स्कीमा बनाएं, इसके स्वामी को [डेटा] स्कीमा तक पहुंच दें और कुछ नहीं। सभी सुरक्षा-दृश्यों को इस स्कीमा में रखें।
-
[निष्पादन] स्वामी की [डेटा] स्कीमा तक पहुंच को निरस्त करें और इसके बजाय इसे [पंक्तियों] स्कीमा तक डेटा पहुंच प्रदान करें।
पूर्ण। अब पंक्ति-स्तरीय सुरक्षा को sProcs और तालिकाओं के बीच पारदर्शी रूप से खिसकाकर कार्यान्वित किया गया है।
अंत में, यहां एक संग्रहीत खरीद है जिसका उपयोग मैं यह याद रखने में मदद के लिए करता हूं कि यह अस्पष्ट सुरक्षा सामग्री कितनी काम करती है और स्वयं के साथ इंटरैक्ट करती है (ओह, कोड का सही संस्करण ):
इस संस्करण के लिएCREATE proc [TestCnxOnly].[spShowProc_Security_NoEX] as
--no "With Execute as Owner" for this version
--create User [UserNoLogin] without login
--Grant connect on database :: TestSecurity to Guest
--alter database TestSecurity set trustworthy on
--Show current user context:
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (sproc)]
, suser_sname() as sname
, system_user as system_
--Execute As Login = 'UserNoLogin'
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (after exec as)]
, suser_sname() as sname
, system_user as system_
EXEC('select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (in Exec(sql))]
, suser_sname() as sname
, system_user as system_')
EXEC sp_ExecuteSQL N'select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (in sp_Executesql)]
, suser_sname() as sname
, system_user as system_'
--Revert
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (aftr revert)]
, suser_sname() as sname
, system_user as system_
[संपादित करें:कोड का संशोधित संस्करण)