Database
 sql >> Base de données >  >> RDS >> Database

Mieux vaut ALTER que DROP

Dans cet article, je vais proposer une construction pour supprimer un objet avant de le créer.

Dans notre équipe, il y a une vingtaine de développeurs SQL Ninja. Tous décrivent cette construction de différentes manières.

Notre équipe est composée d'une vingtaine de SQL Ninjas et tous utilisent l'instruction suivante de manière différente :

IF OBJECT_ID('dbo.Function', 'TF') N'EST PAS NULL DROP FUNCTION dbo.Function;GOCREATE FUNCTION dbo.Function ..

Ou :

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

Ou :

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;GOCREATE FUNCTION dbo.Function ..

Sur StackOverflow, les utilisateurs ont aimé cette version :

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

Les étoiles sont alignées et j'ai trouvé une implémentation appropriée dans l'un des sites SQL. Au début, j'étais choqué, mais ensuite les gens m'ont aidé à voir pourquoi ça marche bien.

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

Le fait est que si vous utilisez les instructions DROP et CREATE à chaque fois, vous supprimez les autorisations d'objet. De plus, l'objet peut être dans la réplication et il sera également supprimé une fois recréé.

Donc, j'ai aimé cette version et j'ai décidé de l'intégrer dans le dbo.antidrop procédure.

La procédure ne prend que deux arguments :le nom de l'objet et son type. Pour vérifier le type d'objet, exécutez l'instruction suivante :

SELECT type FROM sys.objects WHERE nom ='Nom'

Voici à quoi cela ressemblera :

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

Enfin, le code de la procédure est le suivant :

IF OBJECT_ID('dbo.antidrop', 'P') IS 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 + ''') IS NULL EXEC(''CREATE FUNCTION ' + @name + '() RETURNS @t TABLE(i INT) DEBUT RETOUR FIN''); ALLER '; DECLARE @fn NVARCHAR(512) =' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL EXEC(''CREATE FUNCTION ' + @name + '(@ i INT) RENVOIE INT AS BEGIN RETURN @i + 1 END''); ALLER '; DECLARE @p NVARCHAR(512) =' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL EXEC(''CREATE PROC ' + @name + 'AS' '); ALLER '; DECLARE @v NVARCHAR(512) =' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL EXEC(''CREATE VIEW ' + @name + ' AS SELECT 1 comme je''); ALLER '; 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); ENDENDGO

Merci de votre attention !