কীভাবে কোনও একক ভিউতে অ্যাক্সেস যুক্ত কোনও ব্যবহারকারী যুক্ত করবেন?


14

আমি এমএসএসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও 2008 এর সাথে কাজ করছি এবং তাদের ডেটা মিলনের জন্য আমার তৃতীয় পক্ষের কাছে একটি দৃষ্টিভঙ্গি প্রকাশ করা দরকার। আমি উপযুক্ত ভিউ তৈরি করেছি তবে ব্যবহারকারী তৈরি করতে এবং সেই ব্যবহারকারীর ভিউ থেকে নির্বাচন করার জন্য উপযুক্ত অনুমতি দিতে আমার সমস্যা হচ্ছে।

আমি লগইন এবং ব্যবহারকারী তৈরি করার জন্য উইজার্ডগুলি অনুসরণ করেছি এবং তারপরে নির্বাচনের জন্য পরীক্ষিত অনুদান বাক্স সহ সিকিউরিবেলস বিভাগে আমার দৃষ্টিভঙ্গি যুক্ত করেছি। সবকিছু ঠিকঠাক মনে হয়েছিল তবে আমি যখন সেই ব্যবহারকারী হিসাবে লগ ইন করেছি এবং "মাইভিউনাম থেকে" নির্বাচন করুন "করার চেষ্টা করলাম তা আমাকে জানিয়েছিল যে নির্বাচনের অনুমতি অস্বীকার করা হয়েছে।

আমি কেবলমাত্র ব্যবহারকারীকে পুনরায় তৈরি করেছি (এবার কেবল উইজার্ডের পরিবর্তে এসকিউএল ব্যবহার করে) এবং স্পষ্টভাবে নির্বাচিত অনুমতিগুলি দিয়েছি এবং এখন এটি আমাকে ত্রুটি দিচ্ছে: 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.(কেন এটি সম্পর্কিত নয় এমন ডেটাবেস অ্যাক্সেস করার চেষ্টা করছে আমি জানি না ...)

আমি জানি না যে এখান থেকে কোথায় যাব। আবার, মূলত আমার প্রয়োজন এমন একটি ব্যবহারকারী তৈরি করা যা আমি তৃতীয় পক্ষকে তাদের আমাদের ডাটাবেসে সংযুক্ত করতে এবং এই দর্শন থেকে নির্বাচন করতে পারি select


3
অন্যান্য ডাটাবেসে ভিউ রেফারেন্স বেস টেবিলগুলি কি দেখায়? যদি তা হয় তবে আপনাকে মালিকানা শৃঙ্খলাবদ্ধ করতে হবে। এছাড়াও, আপনার বর্তমানে পছন্দসই ডাটাবেসে ডেটাবেস প্রসঙ্গ সেট রয়েছে তা নিশ্চিত করুন।
থমাস স্ট্রিংগার

দেখার জন্য নির্ভরতাগুলি দেখার কোনও উপায় আছে কি? আমি বলতে চাই, যতদূর আমি জানি, ভিউ থেকে সমস্ত কিছুই মূল ডাটাবেসের মধ্যে থাকা উচিত । দর্শনটি কেবল তিনটি ক্ষেত্রের, দুটি অর্থ প্রদানের টেবিল থেকে আসে এবং একটি অ্যাকাউন্টের বিবরণ সারণিতে যোগদান থেকে আসে তবে উভয় সারণী একই ডাটাবেসে থাকে (এবং ভিউ হিসাবে একই ডাটাবেস)।
velojason

উত্তর:


16

দয়া করে এর জন্য ইউআই ব্যবহার করবেন না। এটি একটি বিভ্রান্তিকর জগাখিচুড়ি।

আপনি যা চান তা একটি নির্দিষ্ট ডাটাবেসে কোনও নির্দিষ্ট লগইনের জন্য, যাঁর কেবলমাত্র একটি ভিউ থেকে নির্বাচন করার অনুমতি রয়েছে তা ব্যবহার করার মতো এটি আমার কাছে মনে হচ্ছে। সুতরাং, যেহেতু আপনি ইতিমধ্যে লগইন তৈরি করেছেন:

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

এখানে সম্পাদনা করুন এমন একটি স্ক্রিপ্টের উদাহরণ যা আপনার উল্লেখ করা ত্রুটির দিকে পরিচালিত করবে।

প্রথমে, সম্পর্কযুক্ত_ডিবিতে কিছু টেবিল তৈরি করুন:

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

ফলাফল:

এমএসজি 916, স্তর 14, রাজ্য 1, লাইন 3
বর্তমান সুরক্ষা প্রসঙ্গে সার্ভার অধ্যক্ষ "ব্যবহারকারী নাম" ডাটাবেস "unrelated_db" অ্যাক্সেস করতে সক্ষম নয়।

এখন কোনও বাহ্যিক অবজেক্টের রেফারেন্স না দেওয়ার জন্য ভিউ পরিবর্তন করুন এবং উপরেরটি SELECTআবার চালান , এবং এটি কাজ করে:

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

অর্থ প্রদানের বিবরণ, অ্যাকাউন্টের বিশদ এবং মাইভিউ অবজেক্টের জন্য আমাদের স্ক্রিপ্টগুলি প্রদর্শন করার সংক্ষিপ্ততা, সম্ভবত আপনি আমাদের জানতে পারেন যদি এই কোয়েরিতে কোনও ফলাফল ফেরত দেয় তবে। ক্যাটালগ ভিউয়ের মাধ্যমে আপনি বিভিন্ন অবজেক্টের রেফারেন্স পেতে পারেন 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;

এসকিউএল সার্ভার কেবল unrelated_dbএটির মজাদার জন্য অ্যাক্সেস করার চেষ্টা করতে যাচ্ছে না ... আপনি যে ভিউটি ব্যবহার করার চেষ্টা করছেন তা থেকে সেই ডাটাবেসের সাথে কিছুটা টাই থাকতে হবে। দুর্ভাগ্যক্রমে যদি আমরা সংজ্ঞা সংজ্ঞা এবং যে সমস্ত বস্তুর স্পর্শ করে সে সম্পর্কে আরও বিশদ দেখতে না পাই, তবে আমরা অনুমান করতে পারি all দুটি প্রধান বিষয় যা আমি ভাবতে পারি তা হল প্রতিশব্দ বা ফাংশন যা তিন ভাগের নাম ব্যবহার করে তবে প্রকৃত স্ক্রিপ্টগুলি আমাদের অনুমানের পরিবর্তে আরও অনেক ভাল ধারণা দেবে। :-)

আপনি এটিও পরীক্ষা করতে চাইতে পারেন 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

স্পষ্টতই এটি পুনরাবৃত্তিভাবে সুযোগ সুবিধা দেয় না। ব্যবহারকারীর "আপনার ভিউ" থেকে নির্বাচন করার অনুমতি দেওয়া হয়েছে তবে যদি "আপনার ভিউ" অন্যান্য সম্পর্ক / ডাটাবেসের উপর নির্ভর করে তবে এটি ব্যর্থ হবে: সার্ভারের অধ্যক্ষ "আপনারটিপিভিউজার" বর্তমান সুরক্ষা প্রসঙ্গে "অন্যান্য ডিডিবি" ডাটাবেসটি অ্যাক্সেস করতে পারবেন না।
লিল্লিনাক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.