SQL सर्वर: किसी दृश्य में किसी उपयोगकर्ता के लिए पहुंच का चयन करें और उसकी तालिकाओं में नहीं


11

मेरे पास कुछ डेटाबेस के साथ SQL Server 2012 का उदाहरण है। उनमें से एक में मैंने एक दृश्य बनाया, जो एक डेटाबेस से अधिक में तालिकाओं का चयन करता है।

मैं चाहता हूं कि कोई उपयोगकर्ता उस दृश्य का चयन करने में सक्षम हो, लेकिन उसे अपनी तालिकाओं का चयन नहीं करना चाहिए। दृश्य बिल्कुल बनाया गया था क्योंकि उपयोगकर्ता तालिकाओं का चयन नहीं कर सकता है।

मैंने /programming/368414/grant-select-on-a-view-not-base-table और http://msdn.microsoft.com/en-us/library/ms188676 पढ़ा है । aspx और अभी भी यह काम नहीं कर रहा है।

यदि मैं GRANT SELECT TABLE TO USERसभी तालिकाओं का उपयोग करता हूं , तो उपयोगकर्ता दृश्य का चयन करने में सक्षम है। लेकिन अगर मैं किसी भी तालिका को रद्द करता हूं, तो यह विफल हो जाता है।

यह करने के लिए एक आसान प्रक्रिया होनी चाहिए, लेकिन मुझे इसे बनाने में परेशानी हो रही है। मैंने पहले भी ऐसा होता देखा है (एक उदाहरण के मालिक ने मुझे एक दृश्य तक पहुंच प्रदान की और इसे अपनी तालिकाओं के लिए नहीं किया) लेकिन मैं ऐसा करने में असमर्थ हूं या किसी ऐसे व्यक्ति को ढूंढ सकता हूं जो जानता है कि कैसे।

क्या कोई मुझे यह करने के लिए एक ट्यूटोरियल प्रदान कर सकता है, या एक कोड उदाहरण?


उपयोगकर्ता SELECTsको जब मुझे संदेश दिखाई देता है:

ऑब्जेक्ट <TABLE>, डेटाबेस <DB>, स्कीमा पर SELECT अनुमति को अस्वीकार कर दिया गया था dbo

यदि मैं उस तालिका का चयन करता हूं, तो त्रुटि संदेश तालिका का नाम बदलकर किसी अन्य तालिका में दृश्य को पढ़ता है।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
पॉल व्हाइट 9

जवाबों:


21

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

यहां एक त्वरित उदाहरण है जहां SELECTस्पष्ट रूप से मेज पर नहीं दिया गया है, लेकिन दृश्य पर है। उपयोगकर्ता दृश्य से चयन कर सकता है लेकिन तालिका नहीं।

CREATE USER foo WITHOUT LOGIN;
GO
CREATE TABLE dbo.a(id INT);
CREATE TABLE dbo.b(id INT);
GO
CREATE VIEW dbo.v 
AS 
  SELECT a.id FROM a INNER JOIN b ON a.id = b.id;
GO
GRANT SELECT ON dbo.v TO foo;
GO
EXECUTE AS USER = N'foo';
GO
-- works:
SELECT id FROM dbo.v;
GO
-- Msg 229, SELECT denied:
SELECT id FROM dbo.a;
GO
REVERT;

ध्यान दें कि fooस्कीमा या डेटाबेस पर स्पष्ट अनुमतियों के माध्यम से, या भूमिका या समूह सदस्यता के माध्यम से इस मान को उन्नत विशेषाधिकार प्रदान नहीं किया गया है।

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

दो डेटाबेस और एक लॉगिन बनाएँ:

CREATE DATABASE d1;
GO
CREATE DATABASE d2;
GO
USE [master];
GO
CREATE LOGIN blat WITH PASSWORD = 'x', CHECK_POLICY = OFF;
GO

डेटाबेस में d1, एक उपयोगकर्ता बनाएँ, फिर एक तालिका और उस तालिका के विरुद्ध एक सरल दृश्य बनाएं। केवल देखने के विरुद्ध उपयोगकर्ता का चयन करें :

USE d1;
GO
CREATE USER blat FROM LOGIN blat;
GO
CREATE TABLE dbo.t1(id INT);
GO
CREATE VIEW dbo.v1
AS
  SELECT id FROM dbo.t1;
GO
GRANT SELECT ON dbo.v1 TO blat;
GO

अब, दूसरे डेटाबेस में, उपयोगकर्ता बनाएं, फिर एक और तालिका बनाएं और एक दृश्य जो उस तालिका में शामिल हो जाए, में देखें d1। केवल दृश्य के लिए चयन करें।

USE d2;
GO
CREATE USER blat FROM LOGIN blat;
GO
CREATE TABLE dbo.t2(id INT);
GO
CREATE VIEW dbo.v2
AS
  SELECT v1.id FROM dbo.t2 
    INNER JOIN d1.dbo.v1 AS v1
    ON t2.id = v1.id;
GO
GRANT SELECT ON dbo.v2 TO blat;
GO

अब एक नई क्वेरी विंडो लॉन्च करें और लॉगिन के लिए क्रेडेंशियल्स को बदलें blat( EXECUTE ASयहां काम नहीं करता है)। फिर या तो डेटाबेस के संदर्भ से निम्नलिखित चलाएँ, और इसे ठीक काम करना चाहिए:

SELECT id FROM d1.dbo.v2;

इन दोनों में Msg 229 त्रुटियां होनी चाहिए:

SELECT id FROM d1.dbo.t1;
GO
SELECT id FROM d2.dbo.t2;

परिणाम:

Msg 229, Level 14, State 5, Line 1
SELECT परमिशन को ऑब्जेक्ट 't1', डेटाबेस 'd1', स्कीमा 'dbo' पर अस्वीकार कर दिया गया था।
Msg 229, Level 14, State 5, Line 3
SELECT परमिशन को ऑब्जेक्ट 't2', डेटाबेस 'd2', स्कीमा 'dbo' पर अस्वीकार कर दिया गया था।


1

समुदाय विकी जवाब मूल रूप से अपने लेखक द्वारा प्रश्न में जोड़ा गया:

यह जो मैंने किया है:

  1. डीबी ए में एक दृश्य बनाया, इसमें सभी तालिकाओं को जोड़कर।
  2. SELECTउस दृश्य पर उपयोगकर्ता के लिए पहुँच दी गई है, और इसके किसी भी तालिका के लिए नहीं। उपयोगकर्ता दृश्य को क्वेरी करने में सक्षम था और तालिकाओं को नहीं।
  3. डीबी बी में एक दृश्य बनाया गया, डीबी ए में दृश्य के साथ इस डीबी में तालिकाओं को मिलाकर।
  4. SELECTइस दूसरे दृश्य पर उपयोगकर्ता को दी गई पहुंच, और किसी तालिका में भी नहीं। उपयोगकर्ता इस अंतिम दृश्य को क्वेरी करने और डेटा देखने में सफल रहा।

मुझे लगता है कि यह अजीब है कि एक दृश्य अपने DB में तालिकाओं को क्वेरी करने में सक्षम है कि उपयोगकर्ता की सीधी पहुंच नहीं है, लेकिन इसे अन्य DB से तालिकाओं में करने में असमर्थ है। कम से कम यह काम किया।


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