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 wir eine Version in die Produktion einbinden, hat, um in einer bestimmten Datenbank mehrmals ausgeführt werden zu können. So was:
IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
CREATE TABLE [Table]
(...)
END
Momentan habe ich eine Create-Schema-Anweisung im Deployment/Build-Skript. Wo frage ich nach dem Vorhandensein eines Schemas?
Suchen Sie sys.schemas ?
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'jim')
BEGIN
EXEC('CREATE SCHEMA jim')
END
Notiere dass der CREATE SCHEMA
muss in einem eigenen Batch ausgeführt werden (per die Antwort unten )
@bdukes ist genau das Richtige, um festzustellen, ob das Schema vorhanden ist, aber die obige Anweisung funktioniert in SQL Server 2005 nicht. CREATE SCHEMA <name>
muss in einem eigenen Stapel ausgeführt werden. Ein Workaround ist das Ausführen des CREATE SCHEMA
Anweisung in einer Exec.
Folgendes habe ich in meinen Build-Skripten verwendet:
IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = '<name>')
BEGIN
-- The schema must be run in its own batch!
EXEC( 'CREATE SCHEMA <name>' );
END
Um extra "defensiv" zu sein, generiert die folgende Version einen Typkonvertierungsfehler, um die Möglichkeit (jedoch unwahrscheinlich) von> 1 übereinstimmenden Schema
zu berücksichtigen, ähnlich wie Validierungscode, der häufig absichtlich ausgelöst wird Eine Ausnahme ist, weil ich glaube, dass es gut ist, und ich glaube, es ist "best practice", alle möglichen Rückgabeergebnisse zu berücksichtigen, jedoch unwahrscheinlich, und selbst wenn es nur zu einer schwerwiegenden Ausnahme kommt, da die bekannten Auswirkungen des Stoppens der Verarbeitung in der Regel besser sind als unbekannte Kaskadeneffekte von nicht gefangenen Fehlern. Da dies höchst unwahrscheinlich ist, hielt ich es nicht für sinnvoll, ein separates Count
-Häkchen + Throw
oder Try
-Catch
-Throw
, um einen benutzerfreundlicheren schwerwiegenden Fehler zu generieren, der jedoch immer noch schwerwiegend ist.
SS 2005-:
declare @HasSchemaX bit
set @HasSchemaX = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end
SS 2008+:
declare @HasSchemaX bit = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end
Dann:
if @HasSchemaX = 1
begin
...
end -- if @HasSchemaX = 1
Dies ist alt und ich fühle mich daher gezwungen hinzuzufügen: Für SQL SERVER 2008+ Diese funktionieren alle (für den ausgewählten Teil), und verwenden Sie dann EXECUTE('CREATE SCHEMA <name>')
, um sie tatsächlich für negative Ergebnisse zu erstellen.
DECLARE @schemaName sysname = 'myfunschema';
-- shortest
If EXISTS (SELECT 1 WHERE SCHEMA_ID(@schemaName) IS NOT NULL)
PRINT 'YEA'
ELSE
PRINT 'NOPE'
SELECT DB_NAME() AS dbname WHERE SCHEMA_ID(@schemaName) IS NOT NULL -- nothing returned if not there
IF NOT EXISTS ( SELECT top 1 *
FROM sys.schemas
WHERE name = @schemaName )
PRINT 'WOOPS MISSING'
ELSE
PRINT 'Has Schema'
SELECT SCHEMA_NAME(SCHEMA_ID(@schemaName)) AS SchemaName1 -- null if not there otherwise schema name returned
SELECT SCHEMA_ID(@schemaName) AS SchemaID1-- null if not there otherwise schema id returned
IF EXISTS (
SELECT sd.SchemaExists
FROM (
SELECT
CASE
WHEN SCHEMA_ID(@schemaName) IS NULL THEN 0
WHEN SCHEMA_ID(@schemaName) IS NOT NULL THEN 1
ELSE 0
END AS SchemaExists
) AS sd
WHERE sd.SchemaExists = 1
)
BEGIN
SELECT 'Got it';
END
ELSE
BEGIN
SELECT 'Schema Missing';
END