sql >> Databáze >  >> RDS >> Database

Lepší ALTER než DROP

V tomto článku poskytnu konstrukci pro odstranění objektu před jeho vytvořením.

V našem týmu je asi dvacet vývojářů SQL Ninja. Všechny popisují tuto konstrukci různými způsoby.

Náš tým se skládá z asi dvaceti SQL ninjů a všichni používají následující příkaz jiným způsobem:

IF OBJECT_ID('dbo.Function', 'TF') NENÍ NULL FUNKCE DROP dbo.Function;GOCREATE FUNCTION dbo.Function ..

Nebo:

POKUD EXISTUJE ( SELECT * FROM sys.objects WHERE name ='Procedure' AND type ='P' ) DROP PROCEDURE dbo.Procedure;GOCREATE PROCEDURE dbo.Procedure ..

Nebo:

IF EXISTS ( SELECT 1 FROM sys.objects WHERE object_id =OBJECT_ID(N'dbo.Function') A zadejte IN (N'FN', N'IF', N'TF', N'FS', N' FT')) DROP FUNCTION dbo.Function;GOCREATE FUNCTION dbo.Function ..

Na StackOverflow se uživatelům líbila tato verze:

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

Hvězdičky jsou zarovnány a na jednom z SQL stránek jsem našel vhodnou implementaci. Nejprve jsem byl šokován, ale pak mi lidé pomohli pochopit, proč to funguje dobře.

IF OBJECT_ID('dbo.Function', 'TF') JE NULL EXEC('CREATE FUNCTION dbo.Function() VRACÍ @t TABLE(i INT) ZAČÁTEK NÁVRAT END');FUNKCE BRANKA dbo.Function .. 

Jde o to, že pokud pokaždé použijete příkazy DROP a CREATE, odstraníte oprávnění k objektu. Kromě toho může být objekt v replikaci a po opětovném vytvoření bude rovněž odstraněn.

Takže se mi tato verze líbila a rozhodl jsem se ji zabalit do dbo.antidrop postup.

Procedura má pouze dva argumenty:název objektu a jeho typ. Chcete-li zkontrolovat typ objektu, proveďte následující příkaz:

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

Zde je návod, jak to bude vypadat:

EXEC dbo.antidrop('dbo.Name', 'FN');FUNKCE BRANKA dbo.Name ..

Nakonec je kód procedury následující:

IF OBJECT_ID('dbo.antidrop', 'P') JE NULL EXEC('CREATE PROC dbo.antidrop AS');GOCREATE PROC dbo.antidrop @name SYSNAME, @type SYSNAMEASBEGIN DECLARE @if_tf NVARCHAR(512) =' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') JE NULL EXEC(''CREATE FUNCTION ' + @name + '() RETURNS @t TABLE(i INT) ZAČÁTEK NÁVRAT KONEC''); JÍT '; DECLARE @fn NVARCHAR(512) =' POKUD OBJECT_ID(''' + @name + ''', ''' + @type + ''') JE NULL EXEC(''CREATE FUNCTION ' + @name + '(@ i INT) VRACÍ INT JAKO ZAČÁTEK RETURN @i + 1 KONEC''); JÍT '; DECLARE @p NVARCHAR(512) =' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') JE NULL EXEC(''CREATE PROC ' + @name + 'AS' '); JÍT '; DECLARE @v NVARCHAR(512) =' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') JE NULL EXEC(''CREATE VIEW ' + @name + ' AS SELECT 1 AS i''); JÍT '; IF @zadejte (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); ENDENDGO

Děkuji za pozornost!


  1. 5 způsobů, jak najít řádky, které obsahují velká písmena na serveru SQL

  2. MYSQL Vyberte MAX datum uvnitř příkazu spojení

  3. Jak přejmenovat primární klíč v Oracle tak, aby jej bylo možné znovu použít

  4. Jednoduché nastavení replikace Slony-I.