Question

Dans le cadre de notre processus de construction, nous exécutons un script de mise à jour de la base de données en déployant du code dans 4 environnements différents. De plus, étant donné que la même requête sera ajoutée jusqu'à ce que nous mettions une version en production, elle doit lui permettre de s'exécuter plusieurs fois sur une base de données donnée. Comme ceci:

IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
  CREATE TABLE [Table]
  (...)
END

Actuellement, j'ai une instruction de création de schéma dans le script de déploiement / construction. Où interroger l'existence d'un schéma?

Était-ce utile?

La solution

Recherchez-vous sys.schemas ?

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'jim')
BEGIN
EXEC('CREATE SCHEMA jim')
END

Notez que le CREATE SCHEMA doit être exécuté dans son propre lot (selon la réponse ci-dessous )

Autres conseils

@bdukes a parfaitement raison de déterminer si le schéma existe, mais l'instruction ci-dessus ne fonctionnera pas dans SQL Server 2005. CREATE SCHEMA <name> doit être exécuté dans son propre lot. Une solution consiste à exécuter l'instruction CREATE SCHEMA dans un exec.

Voici ce que j'ai utilisé dans mes scripts de construction:

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

Juste pour être extra & ";" défensive & ";, la version suivante génère une erreur de conversion de type pour tenir compte de la possibilité (peu probable) de > 1 correspondant à Schema est similaire à la façon dont le code de validation renvoie souvent intentionnellement des exceptions parce que je pense que c'est bien et que je pense que c'est & "Meilleure pratique" & ";" pour prendre en compte tous les résultats de retour possibles, même improbables et même s'il s'agit simplement de générer une exception fatale, car les effets connus de l'arrêt du traitement sont généralement supérieurs aux effets en cascade inconnus d'erreurs non interceptées. Parce que c'est très improbable, je ne pensais pas que cela valait la peine d'une vérification séparée Count + + Throw ou Try - Catch - <=> pour générer une erreur fatale plus conviviale mais une erreur fatale toujours plus conviviale. néanmoins.

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

Ensuite:

if @HasSchemaX = 1
begin
   ...
end -- if @HasSchemaX = 1

C’est vieux donc je me sens obligé d’ajouter: Pour SQL SERVER 2008+ Tout cela fonctionne (pour la partie sélectionnée), puis utilisez EXECUTE('CREATE SCHEMA <name>') pour le créer réellement avec des résultats négatifs.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top