Database
 sql >> Baza danych >  >> RDS >> Database

Lepiej ALTER niż DROP

W tym artykule przedstawię konstrukcję do usuwania obiektu przed jego utworzeniem.

W naszym zespole jest około dwudziestu programistów SQL Ninja. Wszystkie z nich opisują tę konstrukcję na różne sposoby.

Nasz zespół składa się z około dwudziestu SQL Ninja i wszyscy używają następującego zdania w inny sposób:

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

Lub:

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

Lub:

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 ..

W StackOverflow użytkownikom podobała się ta wersja:

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

Gwiazdki są wyrównane i znalazłem odpowiednią implementację w jednym z serwisów SQL. Na początku byłem zszokowany, ale potem ludzie pomogli zrozumieć, dlaczego to działa dobrze.

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 ..

Chodzi o to, że jeśli za każdym razem używasz instrukcji DROP i CREATE, to usuwasz uprawnienia do obiektu. Ponadto obiekt może znajdować się w replikacji i zostanie również usunięty po ponownym utworzeniu.

Tak więc spodobała mi się ta wersja i postanowiłem umieścić ją w dbo.antidrop procedura.

Procedura przyjmuje tylko dwa argumenty:nazwę obiektu i jego typ. Aby sprawdzić typ obiektu, wykonaj następującą instrukcję:

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

Oto jak to będzie wyglądać:

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

Na koniec kod procedury wygląda następująco:

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

Dziękuję za uwagę!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zawsze szyfrowana wydajność:kontynuacja

  2. Liczba odczytanych wierszy / Rzeczywiste ostrzeżenia o odczytaniu wierszy w Eksploratorze planów

  3. 10 najważniejszych powodów, dla których powinieneś uczyć się SQL

  4. Prisma, jak wyczyścić bazę danych

  5. Model danych dotyczących opieki nad zwierzętami