2010-11-09 11 views
22

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

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

अंतर्निहित वस्तुओं का पर्दाफाश किए बिना दृश्य या संग्रहीत प्रक्रिया पर SELECT अनुमतियां देने का कोई तरीका है?

+2

अभिगमन कर रहा देखें http://stackoverflow.com/questions/368414/grant-select-on-a-view-not-base-table – stuartd

+0

हाँ, पर पहले मैंने सोचा कि मेरी समस्या नहीं थी। लेकिन यह है;) – thomaspaulb

उत्तर

21

क्या वही उपयोगकर्ता जो दृश्य का मालिक है वह भी अंतर्निहित तालिकाओं का मालिक है? यदि नहीं, तो तालिका के मालिक को अनुदान विकल्प के साथ दृश्य स्वामी की अनुमति प्रदान करने की आवश्यकता है। यदि एक ही उपयोगकर्ता के पास टेबल और दृश्य दोनों का मालिक है, तो दृश्य पर अनुमति देना पर्याप्त होना चाहिए।

+1

आह, अब मैं समझता हूं कि क्या हो रहा है। मेरे पास दो डेटाबेस हैं, और समस्याएं तब उत्पन्न होती हैं जब मैं किसी डेटाबेस में परिभाषित दृश्य में अन्य डेटाबेस के संदर्भ शामिल करता हूं। इसे स्वामित्व के साथ करना है। – thomaspaulb

+0

अनुदान के साथ प्रदान करते हुए हालांकि मालिक अलग-अलग होते हैं, हम केवल चयन करने से अधिक करने के लिए अनुमति दे रहे हैं - क्या यह ऐसी स्थितियों में काम करने के लिए एकमात्र तरीका है (अंतर्निहित वस्तुओं तक पहुंच प्रदान किए बिना)? – rogersillito

2

आपको this forum में जानकारी मिल सकती है। संग्रहित प्रक्रियाओं के लिए, आप EXEC प्रक्रिया को देने जाना चाहिए -

CREATE USER [Reports] FOR LOGIN [Reports] WITH DEFAULT_SCHEMA = Reports 
CREATE SCHEMA Reports AUTHORIZATION Reports --Auth as Reports was the key piece of information that I had missed. 
GO 
CREATE ROLE Reporting AUTHORIZATION db_securityadmin 
GO 
exec sp_addrolemember @rolename = 'Reporting', @membername = 'Reports' 
GO 
GRANT CREATE VIEW TO Reporting 
GRANT CREATE TABLE TO Reporting 

GRANT SELECT, VIEW DEFINITION ON [dbo].[zName] TO Reporting; 

FYI करें:

पिछले पोस्ट क्या एक दृश्य के लिए अनुमति देने के लिए चलाया गया था का ब्यौरा नहीं लेकिन अंतर्निहित टेबल है।

1

आप तालिका से एक अलग स्कीमा में अपने विचार है, तो आप या तो आधार तालिका में उपयोगकर्ता पहुंच तालिकाओं के मालिक इस तरह देखने के लिए देना चाहिए, "अधिकृत करें":

ALTER AUTHORIZATION ON reporting.MyViewName TO dbo 

dbo ऊपर के उदाहरण में टेबल reporting.MyViewName मालिक उपयोगकर्ता

संबंधित मुद्दे