„Create Or Alter“ für MS SQL Server
Bei Oracle und anderen DBMS gibt es die DDL Anweisung „Create Or Alter“ für Procedures, Functions und Views. Das ist praktisch, da man sich keine Gedanken machen muss, ob das Objekt schon vorhanden ist: Ist es vorhanden, wird es aktualisiert, sonst eben neu angelegt.
Im MS SQL Server gibt es so etwas leider nicht. Man behilft sich damit, dass man ein vorhandenes Objekt zunächst löscht (DROP) und dann wieder neu anlegt (CREATE). Das hat nur den großen Nachteil, dass alle vorhandenen Berechtigungen auch mit entfernt werden.
Dann gibt es noch zwei Möglichkeiten
- Man pflegt die Berechtigungen im DROP/CREATE Script immer mit, was bei bei regelmäßigen Änderungen einen entsprechenden zusätzlichen Aufwand darstellt; und damit fehleranfällig.
- Man erstellt bei Design-Änderungen ein zusätzliches ALTER Script, nur wenn man eine neue Datenbank anlegt muss man daran denken, erst das CREATE und dann das ALTER Script auszuführen.
Beides nicht gerade komfortable und auch etwas fehlerträchtig.
Um „Create Or Alter“ nun doch noch abbilden zu können, habe ich mir folgendes überlegt
- Wenn Objekt nicht vorhanden, dann mit „leerem“ Inhalt anlegen
- Anschließend ein ALTER mit dem eigentlichen Design ausführen.
Dabei gibt es aber wieder ein kleines Problem, den die CREATE Anweisung muss die erste in einem Batch sein und somit kann man vorab nicht prüfen, ob das gewünschte Objekt bereits besteht. Aber das ist eben nur ein kleines Problem, dann legen über sp_executesqlmit einem SQL Script als Text an.
Beispiel:
USE [AdventureWorks]
GO
IF OBJECT_ID('dbo.spTestSp', 'P ') IS NULL
EXEC sp_executesql N'CREATE PROCEDURE dbo.spTestSp AS SET NOCOUNT ON;'
GO
ALTER PROCEDURE dbo.spTestSp
@AddressID int
AS
SELECT *
FROM Person.Address
WHERE AddressID = @AddressID;
Kein wirklicher Ersatz, aber mit T-SQL geht es halt nicht besser; zumindest nicht, das ich wüsste.