Microsoft SQL Server
पंक्ति-स्तरीय सुरक्षा
खोज…
आरएलएस फिल्टर विधेय
Sql Server 2016+ और Azure Sql डेटाबेस आपको स्वचालित रूप से उन पंक्तियों को फ़िल्टर करने में सक्षम बनाता है जो कुछ विधेय का उपयोग करके चुनिंदा कथन में वापस आ जाती हैं। इस सुविधा को पंक्ति-स्तरीय सुरक्षा कहा जाता है।
सबसे पहले, आपको एक टेबल-मूल्यवान फ़ंक्शन की आवश्यकता होती है जिसमें कुछ विधेय होते हैं जो यह वर्णन करता है कि यह किस स्थिति में उपयोगकर्ताओं को कुछ तालिका से डेटा पढ़ने की अनुमति देगा:
DROP FUNCTION IF EXISTS dbo.pUserCanAccessCompany
GO
CREATE FUNCTION
dbo.pUserCanAccessCompany(@CompanyID int)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN (
SELECT 1 as canAccess WHERE
CAST(SESSION_CONTEXT(N'CompanyID') as int) = @CompanyID
)
इस उदाहरण में, विधेय कहता है कि केवल उन उपयोगकर्ताओं के पास SESSION_CONTEXT में एक मूल्य है जो इनपुट तर्क से मेल खाते हैं वे कंपनी तक पहुंच सकते हैं। आप कोई अन्य शर्त रख सकते हैं जैसे कि डेटाबेस रोल या मौजूदा उपयोगकर्ता का डेटाबेस_ चेक आदि।
ऊपर दिए गए अधिकांश कोड एक टेम्पलेट है जिसे आप कॉपी-पेस्ट करेंगे। केवल एक चीज जो यहां बदलेगी वह नाम और तर्क की स्थिति और स्थिति में कहां है। अब आप सुरक्षा नीति बनाते हैं जो किसी टेबल पर इस विधेय को लागू करेगी।
अब आप सुरक्षा नीति बना सकते हैं जो किसी तालिका पर विधेय को लागू करेगी:
CREATE SECURITY POLICY dbo.CompanyAccessPolicy
ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
WITH (State=ON)
यह सुरक्षा नीति कंपनी की तालिका के लिए समर्पित है। जब भी कोई कंपनी तालिका से डेटा पढ़ने की कोशिश करता है, तो सुरक्षा नीति प्रत्येक पंक्ति पर विधेय लागू करेगी, कंपनीआईडी कॉलम को विधेय के एक पैरामीटर के रूप में पास करेगी, और विधेयक मूल्यांकन करेगा कि यह पंक्ति SELECT क्वेरी के परिणाम में वापस आ जाए।
आरएलएस सुरक्षा नीति को बदलना
सुरक्षा नीति तालिकाओं से जुड़े विधेय का एक समूह है जिसे एक साथ प्रबंधित किया जा सकता है। आप संपूर्ण नीति में विधेय को जोड़ या हटा सकते हैं या चालू कर सकते हैं।
आप मौजूदा सुरक्षा नीति में तालिकाओं पर अधिक पूर्वानुमान जोड़ सकते हैं।
ALTER SECURITY POLICY dbo.CompanyAccessPolicy
ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
आप सुरक्षा नीति से कुछ विधेय छोड़ सकते हैं:
ALTER SECURITY POLICY dbo.CompanyAccessPolicy
DROP FILTER PREDICATE ON dbo.Company
आप सुरक्षा नीति को अक्षम कर सकते हैं
ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = OFF );
आप अक्षम की गई सुरक्षा नीति को सक्षम कर सकते हैं:
ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = ON );
आरएलएस ब्लॉक विधेय का उपयोग करके अद्यतन को रोकना
पंक्ति-स्तरीय सुरक्षा आपको कुछ विधेयकों को परिभाषित करने में सक्षम बनाती है जो नियंत्रित करेंगे कि तालिका में पंक्तियों को कौन अद्यतन कर सकता है। सबसे पहले आपको कुछ टेबल-वैल्यू फ़ंक्शन को परिभाषित करने की आवश्यकता है जो कि उस डब्ल्यूएल कंट्रोल एक्सेस पॉलिसी का अनुमान लगाती है।
निर्माण कार्य
dbo.pUserCanAccessProduct (@CompanyID int)
RETURNS TABLE
WITH SCHEMABINDING
RETURN के रूप में (चयन 1 के रूप में सफल नहीं है, जहां
CAST (SESSION_CONTEXT (N'CompanyID ') int के रूप में) = @CompanyID
) इस उदाहरण में, विधेय कहता है कि केवल उन उपयोगकर्ताओं के पास SESSION_CONTEXT में एक मूल्य है जो इनपुट तर्क से मेल खाते हैं वे कंपनी तक पहुंच सकते हैं। आप कोई अन्य शर्त रख सकते हैं जैसे कि डेटाबेस रोल या मौजूदा उपयोगकर्ता का डेटाबेस_ चेक आदि।
ऊपर दिए गए अधिकांश कोड एक टेम्पलेट है जिसे आप कॉपी-पेस्ट करेंगे। केवल एक चीज जो यहां बदलेगी वह नाम और तर्क की स्थिति और स्थिति में कहां है। अब आप सुरक्षा नीति बनाते हैं जो किसी टेबल पर इस विधेय को लागू करेगी।
अब हम विधेय के साथ सुरक्षा नीति बना सकते हैं जो उत्पाद तालिका पर अपडेट को अवरुद्ध कर देगा यदि कंपनीआईडी तालिका में कॉलम विधेय को संतुष्ट नहीं करता है।
सृजनात्मक सुरक्षा नीति dbo.ProductAccessPolicy ADD BLOCK PREDICATE dbo.pUserCanAccessProduct (CompanyID) dbo.Product पर
यह विधेय सभी कार्यों पर लागू किया जाएगा। यदि आप कुछ ऑपरेशन पर विधेय लागू करना चाहते हैं तो आप कुछ लिख सकते हैं:
निर्माता सुरक्षा नीति dbo.ProductAccessPolicy ADD ब्लॉक लॉक निजी dbo.pUserCanAccessProduct (CompanyID) dbo.Product AFTER INSERT पर
संभावित विकल्प जिन्हें आप ब्लॉक विधेय परिभाषा के बाद जोड़ सकते हैं:
[{AFTER {INSERT | अपडेट करें } }
| {पहले से {अपडेट | DELETE}}]