SQL सर्वर में, आप किसी संग्रहीत कार्यविधि को बनाते समय एन्क्रिप्ट कर सकते हैं, या एन्क्रिप्शन को शामिल करने के लिए आप इसे बाद में बदल सकते हैं।
T-SQL के साथ एक संग्रहीत कार्यविधि बनाने के लिए, आप CREATE PROCEDURE
. का उपयोग करते हैं वाक्य - विन्यास। इसे एन्क्रिप्ट करने के लिए, आप WITH ENCRYPTION
जोड़ें तर्क।
ALTER PROCEDURE
. का उपयोग करते समय आप मौजूदा प्रक्रिया को एन्क्रिप्ट करने के लिए भी इसी तर्क का उपयोग कर सकते हैं ।
जब आप किसी संग्रहीत कार्यविधि को इस तरह एन्क्रिप्ट करते हैं, तो प्रक्रिया का पाठ एक अस्पष्ट प्रारूप में परिवर्तित हो जाता है। इसकी परिभाषा किसी भी कैटलॉग दृश्य में प्रत्यक्ष रूप से दिखाई नहीं देती है। इसलिए, प्रक्रिया की परिभाषा को उन उपयोगकर्ताओं द्वारा नहीं देखा जा सकता है जिनके पास सिस्टम टेबल या डेटाबेस फ़ाइलों तक पहुंच नहीं है।
उदाहरण 1 - एक एन्क्रिप्टेड संग्रहित प्रक्रिया बनाएं
एन्क्रिप्टेड संग्रहीत कार्यविधि बनाने का एक उदाहरण यहां दिया गया है।
CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname; GO
इसे एन्क्रिप्ट करने का हिस्सा है WITH ENCRYPTION
. अगर मैं इसे एन्क्रिप्ट नहीं करना चाहता तो मैं उस तर्क को आसानी से हटा सकता था।
उदाहरण 2 - परिणाम देखें
उस प्रक्रिया को बनाने के बाद, अब जब मैं sp_helptext
. का उपयोग करता हूं प्रक्रिया की परिभाषा देखने के लिए संग्रहीत प्रक्रिया मुझे एक संदेश मिलता है जो मुझे बताता है कि यह एन्क्रिप्टेड है।
EXEC sp_helptext 'usp_GetCatsByName';
परिणाम:
The text for object 'usp_GetCatsByName' is encrypted.
और अगर मैं sys.sql_modules
. का उपयोग करता हूं सिस्टम कैटलॉग दृश्य मुझे NULL मिलता है।
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('dbo.usp_GetCatsByName');
परिणाम:
+--------------+ | definition | |--------------| | NULL | +--------------+
मुझे एक समान परिणाम मिलता है, इस बात की परवाह किए बिना कि मैं प्रक्रिया की परिभाषा प्राप्त करने के लिए किस टी-एसक्यूएल पद्धति का उपयोग करता हूं।
और जब मैं प्रक्रिया को स्क्रिप्ट करने का प्रयास करता हूं तो मुझे Azure डेटा स्टूडियो में त्रुटि संदेश मिलता है:
No script was returned when scripting as Create on object StoredProcedure
और अगर मैं इसे SSMS, DBeaver, या किसी अन्य GUI डेटाबेस प्रबंधन सॉफ़्टवेयर में देखने का प्रयास करता तो मुझे एक समान संदेश मिलता।
उदाहरण 3 - मौजूदा संग्रहीत प्रक्रिया में एन्क्रिप्शन जोड़ें
यदि आप किसी मौजूदा संग्रहीत कार्यविधि को एन्क्रिप्ट करना चाहते हैं, तो ALTER PROCEDURE
. का उपयोग करें एक ही परिभाषा के साथ। दूसरे शब्दों में, मैं पहला उदाहरण ले सकता हूं, और CREATE
. को प्रतिस्थापित कर सकता हूं ALTER
. के साथ ।
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname; GO
यह स्पष्ट रूप से मानता है कि शेष प्रक्रिया की परिभाषा बिल्कुल मौजूदा जैसी ही है।
यह सुनिश्चित करने का सबसे आसान तरीका है कि आप एक ही परिभाषा का उपयोग कर रहे हैं, यदि यह मौजूद है, तो "स्क्रिप्ट ऐज़ ऑल्टर" विकल्प का उपयोग करके मौजूदा प्रक्रिया को स्क्रिप्ट करने के लिए अपने GUI टूल का उपयोग करना है। अन्यथा आप "स्क्रिप्ट के रूप में बनाएँ" का उपयोग कर सकते हैं, फिर जब परिभाषा दिखाई दे, तो बदलें CREATE
ALTER
. के साथ .
यदि आपके पास केवल एक कमांड लाइन इंटरफ़ेस है, तो आप sys.sql_modules
. को क्वेरी कर सकते हैं मौजूदा परिभाषा प्राप्त करने के लिए देखें (जैसे पिछले उदाहरण में)। फिर आप परिभाषा को कॉपी कर सकते हैं और CREATE
. को बदल सकते हैं ALTER
. के साथ ।
एक बार ऐसा करने के बाद, आप WITH ENCRYPTION
जोड़ सकते हैं और इसे फिर से चलाएँ।
उदाहरण 4 - एक संग्रहीत प्रक्रिया से एन्क्रिप्शन निकालें
हम ALTER PROCEDURE
. चलाकर एन्क्रिप्शन को हटा सकते हैं एन्क्रिप्शन विकल्प के बिना बयान।
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname;
ध्यान दें कि यह संग्रहीत कार्यविधि को डिक्रिप्ट करने के समान नहीं है। यहां, हम केवल मौजूदा प्रक्रिया को नई परिभाषा में बदल रहे हैं। तो यह मान लिया जाता है कि आपके स्रोत नियंत्रण में कहीं न कहीं मौजूदा प्रक्रिया की एक प्रति पहले से ही मौजूद है।
उदाहरण 5 - मूल रूप से संकलित संग्रहीत कार्यविधियाँ
मूल रूप से संकलित संग्रहीत कार्यविधियों पर एन्क्रिप्शन समर्थित नहीं है।
जब मैं मूल रूप से संकलित संग्रहीत कार्यविधि को एन्क्रिप्ट करने का प्रयास करता हूं तो यहां क्या होता है:
ALTER PROCEDURE [dbo].[usp_GetCowsByName] @cowname varchar(70) WITH SCHEMABINDING, NATIVE_COMPILATION, ENCRYPTION AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english' ) SELECT CowId, CowName, Phone FROM dbo.Cows WHERE CowName = @cowname END;
परिणाम:
Msg 10794, Level 16, State 17, Procedure usp_GetCowsByName, Line 3 The option 'ENCRYPTION' is not supported with natively compiled modules.
वह उदाहरण प्रक्रिया मेरे लेख से ली गई है, SQL सर्वर में एक स्कीमा बाउंड संग्रहीत प्रक्रिया कैसे बनाएं, जो यह भी बताती है कि यदि आप मूल रूप से संकलित प्रक्रिया नहीं हैं तो आप एक संग्रहीत प्रक्रिया को स्कीमा बाध्य नहीं कर सकते हैं।
महत्वपूर्ण नोट्स
यहाँ कुछ चीजें हैं जो आपको SQL सर्वर में संग्रहीत कार्यविधियों को एन्क्रिप्ट करने के बारे में जाननी चाहिए:
- विशेषाधिकार प्राप्त उपयोगकर्ता जो डीएसी पोर्ट पर सिस्टम टेबल तक पहुंच सकते हैं या सीधे डेटाबेस फाइलों तक पहुंच सकते हैं, वे अभी भी संग्रहीत प्रक्रिया (गैर-एन्क्रिप्टेड) परिभाषा को देखने में सक्षम होंगे।
- जो उपयोगकर्ता डिबगर को सर्वर प्रक्रिया में संलग्न कर सकते हैं, वे रनटाइम पर स्मृति से मूल प्रक्रिया को पुनः प्राप्त कर सकते हैं।
- एन्क्रिप्शन का उपयोग प्रक्रिया को SQL सर्वर प्रतिकृति के भाग के रूप में प्रकाशित होने से रोकता है।
- सीएलआर प्रक्रियाओं को एन्क्रिप्ट नहीं किया जा सकता है।
- मूल रूप से संकलित प्रक्रियाओं को एन्क्रिप्ट नहीं किया जा सकता है।