Dans le cadre de notre processus de construction, nous exécutons un script de mise à jour de la base de données lorsque nous déployons 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 pouvoir s'exécuter plusieurs fois sur une base de données donnée. Comme ça:
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ù dois-je rechercher l'existence d'un schéma?
sql-server-2005
schema
Pulsehead
la source
la source
Réponses:
Cherchez-vous des sys.schemas ?
Notez que le
CREATE SCHEMA
doit être exécuté dans son propre lot (selon la réponse ci-dessous )la source
SELECT 1/0...
@bdukes a raison pour déterminer si le schéma existe, mais l'instruction ci-dessus ne fonctionnera pas dans SQL Server 2005.
CREATE SCHEMA <name>
doit s'exécuter dans son propre lot. Une solution consiste à exécuter l'CREATE SCHEMA
instruction dans un exécutable.Voici ce que j'ai utilisé dans mes scripts de construction:
la source
Ceci 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 sur des résultats négatifs.la source
IF schema_id ('MySchemaName') IS NULL
fonctionne bien et semble un peu plus pratique que la réponse acceptée.Juste pour être plus "défensif", la version suivante génère une erreur de conversion de type pour tenir compte de la possibilité (cependant improbable) de> 1 correspondance
Schema
similaire à la façon dont le code de validation lance souvent intentionnellement des exceptions parce que je pense que c'est bon et je crois que c'est "" meilleure pratique "" pour tenir compte de tous les résultats de retour possibles, même s'ils sont peu probables 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 meilleurs que les effets en cascade inconnus d'erreurs non piégées. Parce que c'est hautement improbable, je ne pensais pas que cela valait la peine d'uneCount
vérification séparée +Throw
ouTry
-Catch
-Throw
pour générer une erreur fatale plus conviviale, mais toujours une erreur fatale.SS 2005-:
SS 2008+:
Ensuite:
la source
Throw
Exception
. Comme vous l'avez dit, ce n'est pas "" probable "", donc à mon humble avis, cela ne valait pas la peine d'un contrôle completTry
-Catch
ou séparéCount
pour générer une erreur fatale plus conviviale, mais quoi qu'il en soit, je voudrais probablement une erreur fatale. Je crois et je pense que c'est "la meilleure pratique" de tenir compte de tous les résultats de retour possibles, même s'ils sont improbables et même si c'est juste pour générer une exception fatale, car les effets connus de l'arrêt du traitement sont généralement meilleurs que les effets en cascade inconnus de non piégé les erreurs.Select
,Insert
,Update
ouDelete
déclaration est revenu / affecté plus ou moins que le nombre attendu de lignes mais peu probables. Même s'il y a (sont)Unique
Index
actuellement garantissant le nombre attendu de lignes (c'est-à-dire 1) à renvoyer / à affecter, cela pourrait changer (accidentellement ou (à courte vue) "" intentionnellement "") dans le futur.Si la disposition des composants le permet, cela fonctionne également.
la source