it-swarm.com.de

Wie frage ich ab, ob ein Datenbankschema vorhanden ist?

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?

89
Pulsehead

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 )

145
bdukes

@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
149
vfilby

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
1
Tom

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
0