किसी एकल दृश्य तक पहुंच वाले उपयोगकर्ता को कैसे जोड़ा जाए?


14

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

मैंने लॉगिन और उपयोगकर्ता बनाने के लिए विजार्ड्स का अनुसरण किया और फिर सिक्यूरेबल्स अनुभाग में चयनित बॉक्स के लिए चेक बॉक्स के साथ अपना विचार जोड़ा। सब कुछ ठीक लग रहा था लेकिन जब मैंने उस उपयोगकर्ता के रूप में लॉग इन किया और MyViewName से "चयन करें" करने की कोशिश की, तो उसने मुझे बताया कि चयन अनुमति से इनकार कर दिया गया था।

मैंने केवल उपयोगकर्ता को फिर से बनाया (इस बार विज़ार्ड के बजाय सिर्फ SQL का उपयोग करके) और स्पष्ट रूप से चयनित अनुमतियाँ दीं और अब यह मुझे त्रुटि दे Msg 916, Level 14, State 1, Line 2 The server principal "username" is not able to access the database "unrelated_db" under the current security context.रहा है : (मुझे नहीं पता कि यह असंबंधित डेटाबेस तक पहुंचने का प्रयास क्यों कर रहा है ...)

मैं सच में नहीं जानता कि यहाँ से कहाँ जाना है। फिर, मूल रूप से सभी की जरूरत मुझे एक उपयोगकर्ता बनाने के लिए है जिसे मैं तीसरे पक्ष को दे सकता हूं ताकि उन्हें हमारे डेटाबेस से कनेक्ट किया जा सके और इस दृश्य से चयन किया जा सके।


3
क्या अन्य डेटाबेस में व्यू बेस बेस टेबल है? यदि ऐसा है, तो आपको स्वामित्व जंजीरों से निपटना होगा। इसके अलावा, सुनिश्चित करें कि आपके पास वर्तमान में वांछित डेटाबेस के लिए डेटाबेस संदर्भ सेट है।
थॉमस स्ट्रिंगर

क्या देखने के लिए निर्भरता देखने का कोई तरीका है? मेरा मतलब है, जहां तक ​​मुझे पता है, दृश्य से सब कुछ मुख्य डेटाबेस के भीतर समाहित होना चाहिए । दृश्य केवल तीन फ़ील्ड हैं, दो भुगतान विवरण तालिका से आ रहे हैं और एक खाता विवरण तालिका में शामिल होने से आ रहा है, लेकिन दोनों तालिका एक ही डेटाबेस में हैं (और दृश्य के समान डेटाबेस)।
वीरोजासन

जवाबों:


16

कृपया इसके लिए UI का उपयोग न करें। यह भ्रामक गड़बड़ है।

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

USE your_db;
GO
CREATE USER username FROM LOGIN username;
GO
GRANT SELECT ON dbo.MyViewName TO username;
GO

यहां EDIT एक स्क्रिप्ट का एक उदाहरण है जो आपके द्वारा उल्लिखित त्रुटि का कारण होगा।

सबसे पहले, असंबंधित_db में कुछ तालिका बनाएं:

CREATE DATABASE unrelated_db;
GO
USE unrelated_db;
GO
CREATE TABLE dbo.foo(bar INT);
GO

अब एक अपेक्षाकृत प्रतिबंधित लॉगिन बनाएँ:

USE [master];
GO
CREATE LOGIN username WITH PASSWORD='foo', CHECK_POLICY = OFF;
GO

अब एक डेटाबेस बनाएं जहां दृश्य लाइव होगा, और उपयोगकर्ता के रूप में लॉगिन जोड़ें:

CREATE DATABASE velojason;
GO
USE velojason;
GO
CREATE USER username FROM LOGIN username;
GO

अब एक ऐसा फंक्शन बनाएं जो अन्य डेटाबेस में तालिका का संदर्भ देगा, और दूसरी तालिका का एक पर्याय:

CREATE FUNCTION dbo.checkbar()
RETURNS INT
AS 
BEGIN
    RETURN 
    (
      SELECT TOP (1) bar 
        FROM unrelated_db.dbo.foo 
        ORDER BY bar
    );
END
GO
CREATE SYNONYM dbo.foo FOR unrelated_db.dbo.foo;
GO

अब एक स्थानीय तालिका बनाएँ:

CREATE TABLE dbo.PaymentDetails
(
  PaymentID INT
);
GO

अब कोई दृश्य बनाते कि संदर्भ तालिका, समारोह और पर्याय है, और अनुदान SELECTके लिए username:

CREATE VIEW dbo.SomeView
AS
  SELECT 
    p.PaymentID, 
    x = dbo.checkbar(), -- function that pulls from other DB
    y = (SELECT bar FROM dbo.foo) -- synonym to other DB
    FROM dbo.PaymentDetails AS p;
GO
GRANT SELECT ON dbo.SomeView TO username;
GO

अब usernameदृश्य के रूप में केवल स्थानीय कॉलम को निष्पादित करने का प्रयास करें:

EXECUTE AS USER = 'username';
GO
  -- even though I don't reference any of the columns 
  -- in the other DB, I am denied SELECT on the view:
SELECT PaymentID FROM dbo.SomeView;
GO
REVERT;
GO

परिणाम:

Msg 916, स्तर 14, राज्य 1, पंक्ति 3
सर्वर प्रिंसिपल "उपयोगकर्ता नाम" वर्तमान सुरक्षा संदर्भ के तहत डेटाबेस "असंबंधित_दबी" तक पहुंचने में सक्षम नहीं है।

अब किसी भी बाहरी वस्तुओं का संदर्भ नहीं देने के लिए दृश्य बदलें, और ऊपर SELECTफिर से चलाएं , और यह काम करता है:

ALTER VIEW dbo.SomeView
AS
  SELECT 
    p.PaymentID 
    --x = dbo.checkbar(),
    --y = (SELECT bar FROM dbo.foo)
    FROM dbo.PaymentDetails AS p;
GO

भुगतान विवरण, खाता विवरण और MyView ऑब्जेक्ट के लिए हमें स्क्रिप्ट दिखाने में से कुछ, शायद आप हमें बता सकते हैं कि क्या यह क्वेरी कोई परिणाम देती है। आप कैटलॉग दृश्य के माध्यम से विभिन्न वस्तुओं के संदर्भ पा सकते हैं sys.sql_expression_dependencies, लेकिन यह दृश्य सही नहीं है - मेरा मानना ​​है कि यह ताज़ा किए जा रहे सभी दृश्यों पर निर्भर करता है (मामले में जहां संदर्भ अन्य विचारों को देखते हैं, उदाहरण के लिए, या अंतर्निहित स्कीमा बदल गया है) सटीक होने के लिए।

DECLARE 
  @dbname   SYSNAME = N'unrelated_db',
  @viewname SYSNAME = N'dbo.SomeView';

SELECT DISTINCT 
    [This object] = 
    OBJECT_SCHEMA_NAME([referencing_id]) 
      + '.' + OBJECT_NAME([referencing_id]), 
    [references this object] = 
    OBJECT_SCHEMA_NAME([referenced_id]) 
      + '.' + OBJECT_NAME([referenced_id]), 
    [and touches this database] = referenced_database_name,
    [and is a(n)] = o.type_desc,
    [if synonym, it references] = s.base_object_name
FROM sys.sql_expression_dependencies AS d
LEFT OUTER JOIN sys.objects AS o
ON o.[object_id] = d.referenced_id
LEFT OUTER JOIN sys.synonyms AS s
ON d.referenced_id = s.[object_id]
AND s.base_object_name LIKE '%[' + @dbname + ']%'
WHERE OBJECT_ID(@viewname) IN (
        referenced_id, 
        referencing_id, 
        (SELECT referencing_id FROM sys.sql_expression_dependencies 
        WHERE referenced_database_name = @dbname)
) OR referenced_database_name = @dbname;

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

आप जाँचना भी चाह सकते हैं sys.dm_sql_referenced_entities, हालाँकि यह फ़ंक्शन उपरोक्त उदाहरण में कुछ भी उपयोगी नहीं है।


6
create login YourTpvLogin with password = 'enter new password here'
go

use SomeDb
go

create user YourTpvUser for login YourTpvLogin
go

grant select on YourView to YourTpvUser
go

आप निम्न करके इसका परीक्षण कर सकते हैं:

execute as user = 'YourTpvUser'
go

select *
from YourView

revert
go

जाहिरा तौर पर यह विशेषाधिकारों को पुन: प्रदान नहीं करता है। उपयोगकर्ता को "YourView" से चुनने की अनुमति है, लेकिन अगर "YourView" अन्य संबंधों / डेटाबेस पर निर्भर करता है, तो यह विफल हो जाएगा: सर्वर प्रिंसिपल "YourTpvUser" वर्तमान सुरक्षा संदर्भ के तहत डेटाबेस "OtherDb" तक पहुंचने में सक्षम नहीं है।
लीलालिनक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.