Als Teil unseres Erstellungsprozesses führen wir ein Datenbankaktualisierungsskript aus, während wir Code in 4 verschiedenen Umgebungen bereitstellen. Da dieselbe Abfrage hinzugefügt wird, bis eine Version in die Produktion aufgenommen wird , muss sie in einer bestimmten Datenbank mehrmals ausgeführt werden können. So was:
IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
CREATE TABLE [Table]
(...)
END
Derzeit habe ich eine Erstellungsschema-Anweisung im Bereitstellungs- / Erstellungsskript. Wo frage ich nach der Existenz eines Schemas?
sql-server-2005
schema
Pulsehead
quelle
quelle
Antworten:
Suchen Sie nach sys.schemas ?
Beachten Sie, dass das
CREATE SCHEMA
in einem eigenen Stapel ausgeführt werden muss (gemäß der Antwort unten ).quelle
SELECT 1/0...
@bdukes ist genau richtig, um festzustellen, ob das Schema vorhanden ist, aber die obige Anweisung funktioniert in SQL Server 2005 nicht. Sie
CREATE SCHEMA <name>
muss in einem eigenen Stapel ausgeführt werden. Eine Problemumgehung besteht darin, dieCREATE SCHEMA
Anweisung in einer Ausführung auszuführen .Folgendes habe ich in meinen Build-Skripten verwendet:
quelle
Dies ist alt, daher fühle ich mich gezwungen hinzuzufügen: Für SQL SERVER 2008+ Diese funktionieren alle (für den ausgewählten Teil) und werden dann verwendet
EXECUTE('CREATE SCHEMA <name>')
, um sie tatsächlich bei negativen Ergebnissen zu erstellen.quelle
IF schema_id ('MySchemaName') IS NULL
funktioniert gut und scheint ein bisschen bequemer als die akzeptierte Antwort.Um besonders "defensiv" zu sein, generiert die folgende Version einen Typkonvertierungsfehler, um die Möglichkeit (jedoch unwahrscheinlich) von> 1 Übereinstimmungen zu berücksichtigen
Schema
, ähnlich wie Validierungscode häufig absichtlich Ausnahmen auslöst, weil ich glaube, dass dies gut ist und ich glaube, dass dies der Fall ist "'Best Practice'", um alle möglichen Rückgabeergebnisse zu berücksichtigen, jedoch unwahrscheinlich und selbst wenn es sich nur um eine schwerwiegende Ausnahme handelt, da die bekannten Auswirkungen des Stoppens der Verarbeitung normalerweise besser sind als die unbekannten Kaskadeneffekte nicht eingeschlossener Fehler. Da dies höchst unwahrscheinlich ist, hielt ich es nicht für sinnvoll, einen separatenCount
Check +Throw
oderTry
-Catch
-Throw
durchzuführen, um einen benutzerfreundlicheren schwerwiegenden Fehler zu generieren, der jedoch immer noch schwerwiegend ist.SS 2005-:
SS 2008+:
Dann:
quelle
Throw
Exception
. Wie Sie sagten, ist es nicht "wahrscheinlich", also war es meiner Meinung nach kein Ganzes wertTry
-Catch
oder eine separateCount
Überprüfung, um einen benutzerfreundlicheren schwerwiegenden Fehler zu generieren, aber unabhängig davon würde ich wahrscheinlich einen schwerwiegenden Fehler wünschen. Ich glaube an und ich glaube, es ist "Best Practice", alle möglichen Rückgabeergebnisse zu berücksichtigen, auch wenn dies unwahrscheinlich ist und selbst wenn dies nur eine fatale Ausnahme darstellt, da die bekannten Auswirkungen des Stoppens der Verarbeitung normalerweise besser sind als die unbekannten Kaskadeneffekte von nicht eingeschlossenen Daten Fehler.Select
,Insert
,Update
oderDelete
Statement mehr zurück / betroffen oder weniger als die erwarteten Anzahl der Zeilen jedoch unwahrscheinlich. Selbst wennUnique
Index
derzeit sichergestellt wird, dass die erwartete Anzahl (dh 1) der zurückzugebenden / betroffenen Zeilen zurückgegeben wird, könnte sich dies (versehentlich oder (kurzsichtig) "absichtlich") in Zukunft ändern.Wenn das Layout der Komponenten dies zulässt, funktioniert dies auch.
quelle