SQL सर्वर में उपयोगकर्ता-परिभाषित फ़ंक्शन बनाते समय, आपके पास इसे एन्क्रिप्ट करने का विकल्प होता है।
T-SQL के साथ एक उपयोगकर्ता-परिभाषित फ़ंक्शन बनाने के लिए, आप CREATE FUNCTION
का उपयोग करते हैं वाक्य - विन्यास। इसे एन्क्रिप्ट करने के लिए, आप WITH ENCRYPTION
जोड़ें तर्क।
ALTER FUNCTION
. का उपयोग करते समय आप किसी मौजूदा फ़ंक्शन को एन्क्रिप्ट करने के लिए भी उसी तर्क का उपयोग कर सकते हैं ।
जब आप किसी उपयोगकर्ता-परिभाषित फ़ंक्शन को इस तरह एन्क्रिप्ट करते हैं, तो फ़ंक्शन का टेक्स्ट एक अस्पष्ट प्रारूप में परिवर्तित हो जाता है। फ़ंक्शन की परिभाषा किसी भी कैटलॉग दृश्य में सीधे दिखाई नहीं देती है। इसलिए, फ़ंक्शन की परिभाषा को उन उपयोगकर्ताओं द्वारा नहीं देखा जा सकता है जिनके पास सिस्टम टेबल या डेटाबेस फ़ाइलों तक पहुंच नहीं है।
उदाहरण 1 - एन्क्रिप्शन के साथ इनलाइन टेबल-वैल्यूड फंक्शन
एन्क्रिप्टेड उपयोगकर्ता-परिभाषित तालिका-मूल्यवान फ़ंक्शन बनाने का एक उदाहरण यहां दिया गया है।
CREATE FUNCTION dbo.udf_CatsByName_ITVF(@CatName varchar(70) ) ENCRYPTIONASRETURN के साथ रिटर्न टेबल (CITID, CatName, dbo से फोन चुनें।इसे एन्क्रिप्ट करने का हिस्सा है
WITH ENCRYPTION
. अगर मैं इसे एन्क्रिप्ट नहीं करना चाहता तो मैं उस तर्क को आसानी से हटा सकता था।उस फ़ंक्शन को बनाने के बाद, अब जब मैं
sys.sql_modules
. का उपयोग करता हूं सिस्टम कैटलॉग दृश्य इसकी परिभाषा देखने के लिए, मुझे NULL मिलता है।sys.sql_modules से परिभाषा चुनें, जहां object_id =OBJECT_ID('udf_CatsByName_ITVF');परिणाम:
+--------------+| परिभाषा ||--------------|| नल |+--------------+और जब मैं फ़ंक्शन को स्क्रिप्ट करने का प्रयास करता हूं तो मुझे Azure डेटा स्टूडियो में त्रुटि संदेश मिलता है:
क्रिएट ऑन ऑब्जेक्ट UserDefinedFunction के रूप में स्क्रिप्टिंग करते समय कोई स्क्रिप्ट वापस नहीं की गई थीऔर अगर मैं इसे SSMS, DBeaver, या किसी अन्य GUI डेटाबेस प्रबंधन सॉफ़्टवेयर में देखने का प्रयास करता तो मुझे एक समान संदेश मिलता।
उदाहरण 2 - एन्क्रिप्शन के साथ मल्टी-स्टेटमेंट टेबल-वैल्यूड फंक्शन
पेश है एक मल्टी-स्टेटमेंट TVF जो पिछले फंक्शन की तरह ही काम करता है। मल्टी-स्टेटमेंट टीवीएफ का इनलाइन टीवीएफ के लिए एक अलग सिंटैक्स होता है। मल्टी-स्टेटमेंट टीवीएफ पर, आप रिटर्न वेरिएबल निर्दिष्ट करने के बाद एन्क्रिप्शन विकल्प डालते हैं।
फ़ंक्शन बनाएं [डीबीओ]। , dbo.Cats से फ़ोन जहाँ CatName =@CatName; RETURN;END;GOउदाहरण 3 - एन्क्रिप्शन के साथ स्केलर फ़ंक्शन
और यहां एन्क्रिप्टेड स्केलर फ़ंक्शन का एक उदाहरण है:
CREATE FUNCTION dbo.discountPrice(@price DECIMAL(12,2), @discount DECIMAL(12,2)) ENCRYPTIONASBEGIN RETURN @price * (1 - @discount);END;GO के साथ दशमलव (12,2) लौटाता हैउदाहरण 4 - मौजूदा फ़ंक्शन में एन्क्रिप्शन जोड़ें
यदि आप किसी मौजूदा फ़ंक्शन को एन्क्रिप्ट करना चाहते हैं, तो
ALTER FUNCTION
. का उपयोग करें एक ही परिभाषा के साथ। दूसरे शब्दों में, मैं पहला उदाहरण ले सकता हूं, औरCREATE
. को प्रतिस्थापित कर सकता हूंALTER
. के साथ ।ALTER FUNCTION dbo.udf_CatsByName_ITVF(@CatName varchar(70) ) ENCRYPTIONASRETURN के साथ रिटर्न टेबल (चुनें CatId, CatName, फोन से dbo.Cats जहां CatName =@CatName );GOयह स्पष्ट रूप से मानता है कि शेष फ़ंक्शन की परिभाषा बिल्कुल मौजूदा फ़ंक्शन के समान है।
यह सुनिश्चित करने का सबसे आसान तरीका है कि आप एक ही परिभाषा का उपयोग कर रहे हैं, यदि यह मौजूद है, तो "स्क्रिप्ट के रूप में स्क्रिप्ट" विकल्प का उपयोग करके मौजूदा फ़ंक्शन को स्क्रिप्ट करने के लिए अपने GUI टूल का उपयोग करना है। अन्यथा आप "स्क्रिप्ट के रूप में बनाएँ" का उपयोग कर सकते हैं, फिर जब परिभाषा दिखाई देती है, तो बदलें
CREATE
ALTER
. के साथ .यदि आपके पास केवल एक कमांड लाइन इंटरफ़ेस है, तो आप
sys.sql_modules
. को क्वेरी कर सकते हैं मौजूदा परिभाषा प्राप्त करने के लिए देखें (जैसे पिछले उदाहरण में)। फिर आप परिभाषा को कॉपी कर सकते हैं औरCREATE
. को बदल सकते हैंALTER
. के साथ ।एक बार ऐसा करने के बाद, आप
WITH ENCRYPTION
जोड़ सकते हैं और इसे फिर से चलाएँ।उदाहरण 5 - अनेक तर्क जोड़ना
आप अल्पविराम से अलग की गई सूची के रूप में एकाधिक तर्क निर्दिष्ट कर सकते हैं। उदाहरण के लिए, यदि आप एन्क्रिप्शन का उपयोग करना चाहते हैं और आप स्कीमा बाइंडिंग निर्दिष्ट करना चाहते हैं, तो आपको इन्हें अल्पविराम से अलग की गई सूची के रूप में जोड़ना होगा।
CREATE FUNCTION dbo.udf_CatsByName_ITVF(@CatName varchar(70) ) SCHEMABINDING, ENCRYPTIONASRETURN के साथ तालिका लौटाता है ( CatId, CatName, dbo से फोन चुनें।दूसरे शब्दों में, आप केवल
WITH
निर्दिष्ट करते हैं एक बार - प्रत्येक तर्क के लिए इसे दोहराने की आवश्यकता नहीं है।महत्वपूर्ण नोट्स
यहाँ कुछ चीजें हैं जो आपको SQL सर्वर में उपयोगकर्ता-परिभाषित कार्यों को एन्क्रिप्ट करने के बारे में पता होनी चाहिए:
- विशेषाधिकार प्राप्त उपयोगकर्ता जो डीएसी पोर्ट पर सिस्टम टेबल तक पहुंच सकते हैं या सीधे डेटाबेस फाइलों तक पहुंच सकते हैं, वे अभी भी फ़ंक्शन (गैर-एन्क्रिप्टेड) परिभाषा को देखने में सक्षम होंगे।
- जो उपयोगकर्ता डिबगर को सर्वर प्रक्रिया में संलग्न कर सकते हैं, वे रनटाइम पर स्मृति से मूल प्रक्रिया को पुनः प्राप्त कर सकते हैं।
- एन्क्रिप्शन का उपयोग करना फ़ंक्शन को SQL सर्वर प्रतिकृति के भाग के रूप में प्रकाशित होने से रोकता है।
- CLR फ़ंक्शन एन्क्रिप्ट नहीं किए जा सकते.