Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में उपयोगकर्ता-परिभाषित फ़ंक्शन से SCHEMABINDING निकालें

उपयोगकर्ता-परिभाषित फ़ंक्शन (यूडीएफ) को बाध्य करने वाले स्कीमा का उद्देश्य यह सुनिश्चित करना है कि यूडीएफ में संदर्भित मूल वस्तुओं को इस तरह से संशोधित नहीं किया जा सकता है जो फ़ंक्शन की परिभाषा को प्रभावित करेगा।

यह ठीक है, जब तक आपको अंतर्निहित वस्तुओं में कोई बदलाव करने की आवश्यकता नहीं है। लेकिन क्या होगा अगर आपको बदलाव करने की ज़रूरत है?

आप 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 सिंटैक्स का उपयोग किया है, जो फ़ंक्शन के मौजूद न होने की स्थिति में किसी त्रुटि को होने से रोकता है।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. केस संवेदनशील से असंवेदनशील मामले में SQL सर्वर संयोजन को बदलना?

  2. SQL सर्वर में फ़ंक्शन-आधारित अनुक्रमणिका

  3. 6 समस्या प्रश्न जो आपके डेटाबेस को बहुत धीमा कर रहे हैं

  4. 9 महत्वपूर्ण कार्य जिनके लिए डीबीए जिम्मेदार हैं

  5. सीओटी () SQL सर्वर में उदाहरण