उपयोगकर्ता-परिभाषित फ़ंक्शन (यूडीएफ) को बाध्य करने वाले स्कीमा का उद्देश्य यह सुनिश्चित करना है कि यूडीएफ में संदर्भित मूल वस्तुओं को इस तरह से संशोधित नहीं किया जा सकता है जो फ़ंक्शन की परिभाषा को प्रभावित करेगा।
यह ठीक है, जब तक आपको अंतर्निहित वस्तुओं में कोई बदलाव करने की आवश्यकता नहीं है। लेकिन क्या होगा अगर आपको बदलाव करने की ज़रूरत है?
आप UDF से स्कीमा बाइंडिंग को हटा सकते हैं, बेस ऑब्जेक्ट/एस में परिवर्तन कर सकते हैं, फिर स्कीमा बाइंडिंग को फिर से लागू कर सकते हैं।
उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन के आधार ऑब्जेक्ट से बाइंडिंग को हटाने के दो तरीके हैं:
- फ़ंक्शन को बदलें ताकि इसकी परिभाषा अब स्कीमा बाइंडिंग को निर्दिष्ट न करे।
- फ़ंक्शन को छोड़ दें (फिर यदि आवश्यक हो तो स्कीमा बाइंडिंग के बिना इसे फिर से बनाएं)।
स्कीमा-बाउंड फ़ंक्शन का उदाहरण
सबसे पहले, यहां स्कीमा बाउंड फ़ंक्शन का एक उदाहरण दिया गया है:
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)
RETURNS smallint
WITH SCHEMABINDING
AS
BEGIN
DECLARE @AlbumCount int;
SELECT @AlbumCount = COUNT(AlbumId)
FROM dbo.Albums
WHERE ArtistId = @ArtistId;
RETURN @AlbumCount;
END;
हम जानते हैं कि यह एक स्कीमा बाउंड फ़ंक्शन है क्योंकि इसमें WITH SCHEMABINDING . होता है इसकी परिभाषा में। स्कीमा बाइंडिंग को हटाने के लिए, हमें केवल उस बिट को हटाना होगा।
विकल्प 1 - फ़ंक्शन को बदलें
इस फ़ंक्शन से स्कीमा बाइंडिंग को बदलकर इसे हटाने के लिए, हम निम्नलिखित कोड का उपयोग कर सकते हैं:
ALTER FUNCTION dbo.ufn_CountAlbums (@ArtistId int)
RETURNS smallint
AS
BEGIN
DECLARE @AlbumCount int;
SELECT @AlbumCount = COUNT(AlbumId)
FROM dbo.Albums
WHERE ArtistId = @ArtistId;
RETURN @AlbumCount;
END;
हमने केवल CREATE change में बदलाव किया था करने के लिए ALTER , और WITH SCHEMABINDING remove को हटा दें ।
विकल्प 2 - फंक्शन ड्रॉप करें
यहां फ़ंक्शन को छोड़ने, फिर उसे स्कीमा बाइंडिंग के बिना फिर से बनाने का एक उदाहरण दिया गया है:
DROP FUNCTION IF EXISTS dbo.ufn_CountAlbums;
GO
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)
RETURNS smallint
AS
BEGIN
DECLARE @AlbumCount int;
SELECT @AlbumCount = COUNT(AlbumId)
FROM dbo.Albums
WHERE ArtistId = @ArtistId;
RETURN @AlbumCount;
END;
इस मामले में, मैंने DROP IF EXISTS सिंटैक्स का उपयोग किया है, जो फ़ंक्शन के मौजूद न होने की स्थिति में किसी त्रुटि को होने से रोकता है।