In diesem Artikel werde ich eine Konstruktion zum Löschen eines Objekts bereitstellen, bevor es erstellt wird.

In unserem Team gibt es ungefähr zwanzig SQL Ninja-Entwickler. Alle beschreiben diese Konstruktion auf unterschiedliche Weise.
Unser Team besteht aus ungefähr zwanzig SQL-Ninjas und alle verwenden die folgende Anweisung auf unterschiedliche Weise:
IF OBJECT_ID('dbo.Function', 'TF') IS NOT NULL
DROP FUNCTION dbo.Function;
GO
CREATE FUNCTION dbo.Function .. Oder:
IF EXISTS (
SELECT *
FROM sys.objects
WHERE name = 'Procedure'
AND type = 'P'
)
DROP PROCEDURE dbo.Procedure;
GO
CREATE PROCEDURE dbo.Procedure .. Oder:
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 .. Auf StackOverflow mochten Benutzer diese 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_name
GO Die Sterne sind ausgerichtet und ich habe eine geeignete Implementierung in einer der SQL-Sites gefunden. Zuerst war ich schockiert, aber dann halfen mir die Leute zu sehen, warum es gut funktioniert.
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 .. Der Punkt ist, dass Sie Objektberechtigungen löschen, wenn Sie jedes Mal die Anweisungen DROP und CREATE verwenden. Außerdem kann sich das Objekt in der Replikation befinden und wird nach dem erneuten Erstellen ebenfalls gelöscht.
Diese Version gefiel mir also und ich beschloss, sie in dbo.antidrop einzupacken Verfahren.
Die Prozedur nimmt nur zwei Argumente entgegen:den Objektnamen und seinen Typ. Um den Objekttyp zu überprüfen, führen Sie die folgende Anweisung aus:
SELECT type FROM sys.objects WHERE name = 'Name'
So wird es aussehen:
EXEC dbo.antidrop('dbo.Name', 'FN');
GO
ALTER FUNCTION dbo.Name .. Schließlich lautet der Code der Prozedur wie folgt:
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 Vielen Dank für Ihre Aufmerksamkeit!