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

DROP से बेहतर ALTER

इस लेख में, मैं किसी वस्तु को बनाने से पहले उसे हटाने के लिए एक निर्माण प्रदान करने जा रहा हूँ।

हमारी टीम में लगभग बीस SQL ​​निंजा डेवलपर हैं। वे सभी इस निर्माण का अलग-अलग तरीकों से वर्णन करते हैं।

हमारी टीम में लगभग बीस SQL ​​निन्जा शामिल हैं और वे सभी निम्नलिखित कथन का अलग तरीके से उपयोग करते हैं:

IF OBJECT_ID('dbo.Function', 'TF') IS NOT NULL
	DROP FUNCTION dbo.Function;
GO
CREATE FUNCTION dbo.Function ..

या:

IF EXISTS (
    SELECT * 
    FROM sys.objects 
    WHERE name = 'Procedure'
        AND type = 'P' 
)
    DROP PROCEDURE dbo.Procedure;
GO
CREATE PROCEDURE dbo.Procedure ..

या:

IF EXISTS (
    SELECT 1
    FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'dbo.Function')
        AND type IN (N'FN', N'IF', N'TF', N'FS', N'FT')
)
    DROP FUNCTION dbo.Function;
GO
CREATE FUNCTION dbo.Function ..

StackOverflow पर, उपयोगकर्ताओं को यह संस्करण पसंद आया:

IF EXISTS (
    SELECT * FROM sysobjects WHERE id = object_id(N'function_name') 
    AND xtype IN (N'FN', N'IF', N'TF')
)
    DROP FUNCTION function_name
GO

सितारों को संरेखित किया गया है और मुझे SQL साइटों में से एक में उपयुक्त कार्यान्वयन मिला है। सबसे पहले, मैं चौंक गया, लेकिन फिर लोगों ने यह देखने में मदद की कि यह अच्छा क्यों काम करता है।

IF OBJECT_ID('dbo.Function', 'TF') IS NULL
    EXEC('CREATE FUNCTION dbo.Function() RETURNS @t TABLE(i INT) BEGIN RETURN END');
GO
ALTER FUNCTION dbo.Function ..

मुद्दा यह है कि यदि आप हर बार DROP और CREATE स्टेटमेंट का उपयोग करते हैं, तो आप ऑब्जेक्ट अनुमतियों को हटा देते हैं। इसके अलावा, ऑब्जेक्ट प्रतिकृति में हो सकता है और इसे फिर से बनाए जाने के बाद भी हटा दिया जाएगा।

इसलिए, मुझे यह संस्करण पसंद आया और मैंने इसे dbo.antidrop . में लपेटने का निर्णय लिया प्रक्रिया।

प्रक्रिया में केवल दो तर्क होते हैं:वस्तु का नाम और उसका प्रकार। ऑब्जेक्ट प्रकार की जांच करने के लिए, निम्नलिखित कथन निष्पादित करें:

SELECT type 
FROM sys.objects 
WHERE name = 'Name'

यह इस तरह दिखेगा:

EXEC dbo.antidrop('dbo.Name', 'FN');
GO
ALTER FUNCTION dbo.Name ..

अंत में, प्रक्रिया का कोड इस प्रकार है:

IF OBJECT_ID('dbo.antidrop', 'P') IS NULL
    EXEC('CREATE PROC dbo.antidrop AS');
GO
CREATE PROC dbo.antidrop @name SYSNAME, @type SYSNAME
AS
BEGIN

    DECLARE @if_tf NVARCHAR(512) = '
        IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL
            EXEC(''CREATE FUNCTION ' + @name + '() RETURNS @t TABLE(i INT) BEGIN RETURN END'');
        GO
    ';
    DECLARE @fn NVARCHAR(512) = '
        IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL
            EXEC(''CREATE FUNCTION ' + @name + '(@i INT) RETURNS INT AS BEGIN RETURN @i + 1 END'');
        GO
    ';
    DECLARE @p NVARCHAR(512) = '
        IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL
            EXEC(''CREATE PROC ' + @name + 'AS'');
        GO
    ';
    DECLARE @v NVARCHAR(512) = '
        IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL
            EXEC(''CREATE VIEW ' + @name + ' AS SELECT 1 AS i'');
        GO
    ';

    IF @type in (N'IF', N'TF')
    BEGIN
        EXEC(@if_tf);
    END

    ELSE IF @type = N'FN'
    BEGIN
        EXEC(@fn);
    END
    
    ELSE IF @type = N'P'
    BEGIN
        EXEC(@p);
    END

    ELSE IF @type = N'V'
    BEGIN
        EXEC(@v);
    END

END
GO

ध्यान देने के लिए धन्यवाद!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. बार्कर का अंकन

  2. झुंड क्लस्टर के साथ Azure कंटेनर सेवा पर डॉकर का उपयोग करना

  3. SAS JMP को Salesforce.com से जोड़ना

  4. SQL जॉइन के लिए आपका अंतिम गाइड:क्रॉस जॉइन - भाग 3

  5. टी-एसक्यूएल बनाम एसक्यूएल