এসকিউএল সার্ভার সুরক্ষা মডেল আপনাকে অন্তর্নিহিত সারণীতে অ্যাক্সেস না দিয়ে কোনও দৃশ্যে অ্যাক্সেসের অনুমতি দেয়।
যেহেতু উদাহরণ কোডটি একটি ধারণা দেখানোর দুর্দান্ত উপায়, নীচে একটি LoginDetails
টেবিল সহ এবং অনুরূপ দৃষ্টিভঙ্গিটি বিবেচনা করুন:
CREATE TABLE dbo.LoginDetails
(
Username nvarchar(100) NOT NULL
, EmailAddress nvarchar(256) NOT NULL
, LastLoggedInAt datetime NULL
);
GO
CREATE VIEW dbo.LoginDetailsView
AS
SELECT ld.Username
, ld.EmailAddress
, ld.LastLoggedInAt
FROM dbo.LoginDetails ld
WHERE ld.LastLoggedInAt IS NOT NULL;
GO
আমরা একটি লগইন এবং একটি ব্যবহারকারী তৈরি করব, তারপরে সেই ব্যবহারকারীর সারণীটি দেখার কোনও অধিকার ছাড়াই ভিউ থেকে সারি নির্বাচন করার অধিকার নির্ধারণ করব।
CREATE LOGIN RemoteUser
WITH PASSWORD = '2q1345lkjsadfgsa0(*';
CREATE USER RemoteUser
FOR LOGIN RemoteUser
WITH DEFAULT_SCHEMA = dbo;
GRANT SELECT ON dbo.LoginDetailsView TO RemoteUser;
এখন, আমরা দুটি পরীক্ষার সারি সন্নিবেশ করবো:
INSERT INTO dbo.LoginDetails(Username, EmailAddress, LastLoggedInAt)
VALUES ('user x', 'x@y.com', NULL)
, ('user y', 'y@y.com', GETDATE());
এটি সুরক্ষা মডেলটি পরীক্ষা করে। প্রথম SELECT
বিবৃতিটি সফল হয়, যেহেতু এটি ভিউ থেকে নির্বাচন করা হচ্ছে, অন্যদিকে দ্বিতীয় SELECT
বিবৃতি ব্যর্থ হয়েছে কারণ ব্যবহারকারীর টেবিলটিতে সরাসরি অ্যাক্সেস নেই।
EXECUTE AS LOGIN = 'RemoteUser';
SELECT *
FROM dbo.LoginDetailsView;
╔══════════╦══════════════╦═══════════════════════ ══╗
║ ব্যবহারকারীর নাম ║ ইমেল অ্যাড্রেস ║ লাস্টলগডইনআ্যাট ║ ║
╠══════════╬══════════════╬═══════════════════════ ══╣
Y ব্যবহারকারী y ║ y@y.com ║ 2018-02-15 07: 36: 54.490 ║
╚══════════╩══════════════╩═══════════════════════ ══╝
SELECT *
FROM dbo.LoginDetails;
REVERT
আপনার প্রশ্নের প্রয়োজন অনুসারে LastLoggedInAt
মানটি থেকে প্রাপ্ত ফলাফলগুলি সারিটি বাদ দিন NoteNULL
SELECT
অন্তর্নিহিত টেবিলের বিপরীতে দ্বিতীয় বিবৃতিটি একটি ত্রুটি প্রদান করে:
এমএসজি 229, স্তর 14, রাজ্য 5, লাইন 28
বস্তু 'লগইনডেটেলস', ডাটাবেস 'টেম্পডিবি', স্কিমা 'ডিবিও' তে SELECT অনুমতি অস্বীকার করা হয়েছিল।
পরিষ্কার কর:
DROP USER RemoteUser;
DROP LOGIN RemoteUser;
DROP VIEW dbo.LoginDetailsView;
DROP TABLE dbo.LoginDetails;
পর্যায়ক্রমে, যদি আপনার এসকিউএল সার্ভার 2016 বা আরও নতুন হয় তবে আপনি নির্দিষ্ট ব্যবহারকারীদের একটি নাল LastLoggedInAt
মান সহ রোধ করতে রোধ করতে একটি সারি-স্তরের-সুরক্ষা-প্রিকিকেট ব্যবহার করতে পারেন ।
প্রথমত, আমরা সেই লগইনের জন্য সারণী, একটি লগইন, ব্যবহারকারী তৈরি করি এবং আমরা টেবিলটিতে অ্যাক্সেস প্রদান করি:
CREATE TABLE dbo.LoginDetails
(
Username nvarchar(100) NOT NULL
, EmailAddress nvarchar(256) NOT NULL
, LastLoggedInAt datetime NULL
);
GO
CREATE LOGIN RemoteUser
WITH PASSWORD = '2q1345lkjsadfgsa0(*';
CREATE USER RemoteUser
FOR LOGIN RemoteUser
WITH DEFAULT_SCHEMA = dbo;
GRANT SELECT ON dbo.LoginDetails TO RemoteUser;
এর পরে, আমরা কয়েকটি নমুনা সারি সন্নিবেশ করি। নাল দিয়ে একটি সারি LastLoggedInAt
এবং সেই কলামটির জন্য একটি নন-নাল মান সহ।
INSERT INTO dbo.LoginDetails(Username, EmailAddress, LastLoggedInAt)
VALUES ('user x', 'x@y.com', NULL)
, ('user y', 'y@y.com', GETDATE());
এখানে, আমরা একটি স্কিমা-সীমাবদ্ধ টেবিল-মানযুক্ত-ফাংশন তৈরি করছি যা ফাংশনে স্থানান্তরিত হবে @LastLoggedInAt
এবং @username
ভেরিয়েবলের মানের উপর নির্ভর করে 0 বা 1 দিয়ে একটি সারি দেয়। এই ফাংশনটি আমরা নির্দিষ্ট ব্যবহারকারীর কাছ থেকে যে সারিগুলি আড়াল করতে চাই তা সরিয়ে দিতে ফিল্টার-প্রিডিকেট দ্বারা ব্যবহৃত হবে।
CREATE FUNCTION dbo.fn_LoginDetailsRemoteUserPredicate
(
@LastLoggedInAt datetime
, @username sysname
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS fn_securitypredicate_result
WHERE (@username = N'RemoteUser' AND @LastLoggedInAt IS NOT NULL)
OR @username <> N'RemoteUser';
GO
এটি সিকিউরিটি ফিল্টার যা টেবিলের SELECT
বিপরীতে চালানো বিবৃতিগুলি থেকে সারিগুলি সরিয়ে দেয় dbo.LoginDetails
:
CREATE SECURITY POLICY LoginDetailsRemoteUserPolicy
ADD FILTER PREDICATE dbo.fn_LoginDetailsRemoteUserPredicate(LastLoggedInAt, USER_NAME())
ON dbo.LoginDetails
WITH (STATE=ON);
উপরের ফিল্টারটি dbo.fn_LoginDetailsRemoteUserPredicate
বর্তমান ব্যবহারকারীর নাম সারণী LastLoggedInAt
থেকে কলামের জন্য প্রতিটি সারি থেকে আসা মানগুলি সহ ফাংশনটি ব্যবহার করে dbo.LoginDetails
।
যদি আমরা সাধারণ ব্যবহারকারী হিসাবে টেবিলটি জিজ্ঞাসা করি:
SELECT *
FROM dbo.LoginDetails
আমরা সমস্ত সারি দেখতে পাই:
╔══════════╦══════════════╦═══════════════════════ ══╗
║ ব্যবহারকারীর নাম ║ ইমেল অ্যাড্রেস ║ লাস্টলগডইনআ্যাট ║ ║
╠══════════╬══════════════╬═══════════════════════ ══╣
║ ব্যবহারকারী x ║ x@y.com ║ NULL ║ ║
Y ব্যবহারকারী y ║ y@y.com ║ 2018-02-15 13: 53: 42.577 ║ ║
╚══════════╩══════════════╩═══════════════════════ ══╝
তবে, যদি আমরা পরীক্ষা করি RemoteUser
:
EXECUTE AS LOGIN = 'RemoteUser';
SELECT *
FROM dbo.LoginDetails
REVERT
আমরা কেবল "বৈধ" সারিগুলি দেখতে পাই:
╔══════════╦══════════════╦═══════════════════════ ══╗
║ ব্যবহারকারীর নাম ║ ইমেল অ্যাড্রেস ║ লাস্টলগডইনআ্যাট ║ ║
╠══════════╬══════════════╬═══════════════════════ ══╣
Y ব্যবহারকারী y ║ y@y.com ║ 2018-02-15 13: 42: 02.023 ║
╚══════════╩══════════════╩═══════════════════════ ══╝
এবং, আমরা পরিষ্কার:
DROP SECURITY POLICY LoginDetailsRemoteUserPolicy;
DROP FUNCTION dbo.fn_LoginDetailsRemoteUserPredicate;
DROP USER RemoteUser;
DROP LOGIN RemoteUser;
DROP TABLE dbo.LoginDetails;
সচেতন থাকুন যে স্কিমা-এইভাবে কোনও ফাংশনটি টেবিলের সাথে আবদ্ধ করার ফলে ফিল্টারের প্রাকটিকেট এবং dbo.fn_LoginDetailsRemoteUserPredicate
ফাংশনটিকে প্রথমে না ফেলে টেবিলের সংজ্ঞাটি সংশোধন করা অসম্ভব করে তোলে ।