2011-10-18 14 views
7

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

उत्तर

12

दृश्य पर UPDATE/DELETE/INSERT अनुमतियों को हटाने का सबसे अच्छा तरीका होगा।

इसके अलावा आप इस दृश्य पर INSTEAD OF ट्रिगर बना सकते हैं कि अपडेट को चुपचाप विफल करने के लिए कुछ भी नहीं है या quite a few constructs that make views non updatable हैं। तो आप एक ऐसा चुन सकते हैं जो semantics या दक्षता को परिवर्तित नहीं करता है और फिर इसका उल्लंघन करता है।

संपादित करें: नीचे बिल फिट बैठता है।

CREATE VIEW Bar 
AS 
SELECT TOP 100 PERCENT x 
FROM foo 
WITH CHECK OPTION 
+0

+1 अनुमतियों को इस कोड को रोकना चाहिए। लेकिन यदि लोक दृश्य के माध्यम से लिख सकता है तो मुझे संदेह है कि बेस टेबल पर भी अनुमतियां हैं ... – gbn

+0

धन्यवाद, एक आकर्षण की तरह काम करता है। वे विचार वास्तव में एक अन्य डेटाबेस का संदर्भ लेंगे, जिसे उपयोगकर्ता तक पहुंच नहीं पाएगा। मैं उन्हें केवल पढ़ने के लिए चाहता हूं ताकि उपयोगकर्ता उस डेटाबेस को संशोधित करने में सक्षम न हो, जिसके पास उस डेटाबेस में विचारों के माध्यम से पहुंच नहीं है जिसके पास पहुंच है। मैं चीज़ों को सरल रखने के लिए प्रति-ऑब्जेक्ट अनुमतियों के बजाय प्रति-डेटाबेस अनुमतियों का उपयोग करना चाहता हूं और यह सुनिश्चित करना चाहता हूं कि मुझे अनुमति परिभाषाओं में उल्लंघन न हो। –

+3

मैं अंत में संलग्न कोड के साथ एक खतरे को इंगित करूंगा। ऐसा लगता है कि 'जांच विकल्प' पर निर्भर है। यदि आप SQL सर्वर प्रबंधन स्टूडियो के साथ दृश्य को वापस और देर से संपादित करते हैं, तो इसमें 'विकल्प विकल्प के साथ' शामिल नहीं होगा और दृश्य को फिर से पढ़ा/लिखना होगा। – BIBD

7

आप एक UNION ऑपरेटर आदेश एसक्यूएल सर्वर बनाने के लिए निर्दिष्ट कर सकते हैं सम्मिलित/अपडेट करने के दौरान विफल/ हटाने की कार्रवाई, इस तरह:

create view SampleView 
as 
    select ID, value from table 
    union all 
    select 0, '0' where 1=0 

पिछले क्वेरी समस्त पंक्तियां वापस नहीं करता है UNION सुरक्षित रूप से उपयोग करने के लिए, बिल्कुल पहले क्वेरी के समान डेटा प्रकारों के साथ फ़ील्ड की समान मात्रा होनी चाहिए। अधिक जानकारी के लिए यह लिंक देखें: Different ways to make a table read only in a SQL Server database

+0

आप "यूनियन चयन शीर्ष 0 * तालिका से" भी जोड़ सकते हैं (कम से कम SQLServer 2014 में)। – Christoph

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