Question:
Des outils de maintenance et de déploiement de schémas de base de données et de données pour SQL Server?
Kenny Evitt
2014-02-05 22:09:40 UTC
view on stackexchange narkive permalink

Je souhaite conserver le schéma et les données «statiques» d'une base de données SQL Server sous forme de code dans un système de contrôle de version. J'aimerais également pouvoir déployer des versions spécifiques du code de la base de données sur des instances réelles de la base de données pertinente, c'est-à-dire migrer une base de données vers une nouvelle version (et éventuellement «migrer vers le bas» vers une ancienne version).

Clarification

Bases de données

Je suppose que je n'ai pas besoin d'expliquer ce qu'est une base de données ou ce SQL Server est un système de base de données spécifique, c'est-à-dire un logiciel spécifique de gestion de bases de données.

Schéma de base de données en tant que code

Parmi les développeurs de logiciels qui travaillent avec des bases de données, il est souhaitable pour pouvoir maintenir le " schéma" d'une base de données, c'est-à-dire des informations sur sa structure, sous forme de " code". Ce code devrait permettre à quelqu'un de créer une base de données avec le même «schéma» que celui représenté par le code. Le code peut être sous la forme d'instructions DDL ( Data Definition Language), par exemple Code SQL, généralement dans une version spécifique du fournisseur, utilisé pour créer des objets tels que des tables et des index dans une base de données, ou il pourrait être dans un langage de programmation général, par exemple Java, Ruby, C #, etc.

Contrôle de version et code

Une fois le schéma d'une base de données est représentée dans le code, ce code peut être maintenu dans un contrôle de version ou un système de contrôle de source, logiciel de gestion de contrôle de révision. De Wikipedia:

Le contrôle de révision, également connu sous le nom de contrôle de version et de contrôle de source (et un aspect de la gestion de la configuration logicielle), consiste à gérer les modifications apportées aux documents, aux programmes informatiques, aux grands sites Web et d'autres collections d'informations.

La gestion du code qui représente le schéma d'une base de données dans un système de contrôle de version est souhaitable car un historique des modifications du schéma peut être conservé et d'autres outils, comme l'ensemble d'outils que je pose dans cette question, peuvent accéder le schéma, même les différentes versions du schéma, pour d'autres utilisations.

Déploiement de logiciel

' Déploiement', dans le contexte du développement de logiciel et la maintenance du logiciel, implique "... toutes les activités qui rendent un système logiciel disponible pour utilisation". Dans le cadre de cette question, je suis intéressé par les recommandations d'outils logiciels permettant de mettre à disposition une version spécifique d'un schéma de base de données sous la forme d'instances concrètes spécifiques de bases de données dans le SGBD SQL Server.

Exemple

À titre d'exemple, considérons un schéma de base de données avec les versions v1 , v2 et v3 , et un certain nombre de bases de données réelles , qui ont tous une de ces versions du schéma. Pour cette question, le logiciel recommandé doit être capable de mettre à niveau (ou de rétrograder) une base de données particulière de sa version actuelle vers toute autre version du même schéma, et il doit utiliser le code de la version de schéma spécifique qui est stockée dans le système de contrôle de version.

Quelques critères spécifiques mentionnés dans les commentaires

"sélectionnez une entrée de contrôle de version contenant un schéma, (re) notez la base de données pour qu'elle corresponde (qu'est-ce que cela signifie exactement?"

Le schéma de la base de données est représenté sous forme de code dans un système de contrôle de version. Je ne suis pas intéressé par les outils qui fonctionnent directement avec le contrôle de version. Les outils pour lesquels cette question sollicite des recommandations devraient pouvoir utiliser une 'version' du schéma de base de données. Un exemple de schéma 'version' serait le code qui représente le schéma comme une révision spécifique ('commit' dans Git) ou une balise / étiquette spécifique pour le contrôle de version systèmes qui prennent en charge de telles fonctionnalités.

Voici une liste de base des fonctionnalités qui devraient être fournies pour un outil permettant de "(re) noter la base de données [cible] pour qu'elle corresponde":

Tables

  • Si une table existe dans le schéma source mais pas dans la base de données cible, l'outil doit créer la table dans la base de données cible. Cela doit inclure des objets auxiliaires tels que des clés, des contraintes, des valeurs par défaut, des index, des déclencheurs, etc.
  • Si une table n'existe pas dans le schéma source mais existe dans la base de données cible, l'outil doit fournir des moyens pour spécifier si la table de la base de données cible doit être supprimée ou non. [Ce paramètre peut s'appliquer à toutes ces tables.]

Colonnes de table

  • Si une colonne existe dans une table du schéma source mais pas dans le même 1 table dans la base de données cible, elle doit être créée dans la base de données cible. Comme les instructions DDL pour la plupart des (?) SGBD fournissent déjà des moyens de spécifier la valeur initiale des nouvelles colonnes pour les tables existantes (par exemple, en particulier pour les nouvelles colonnes qui n'autorisent pas les valeurs NULL ), Je ne sais pas si quelque chose de spécial doit être fourni par l'outil lui-même pour gérer cela. Cependant , si un outil recommandé utilise une forme de «code de schéma» qui n'est pas les instructions DDL standard du SGBD respectif 2 , alors l'outil doit fournir un moyen de spécifier les valeurs initiales des colonnes à ajouter.
  • Si une colonne de table n'existe pas dans le schéma source mais existe dans la base de données cible, le L'outil doit fournir des moyens pour spécifier si la colonne de la base de données cible doit être supprimée ou non. [Ce paramètre peut s'appliquer à toutes ces colonnes de tableau.]
  • Si la même colonne de table 1 existe à la fois dans le schéma source et dans les bases de données cible, mais qu'elles sont de types différents ou s'il existe d'autres différences (par exemple, longueur, échelle numérique, etc.), L'outil doit changer la colonne de la base de données cible pour qu'elle corresponde au schéma source et faire de son mieux pour conserver les données existantes dans cette colonne . Il est parfaitement valable pour un outil recommandé de quitter l'échec de rapport s'il ne parvient pas à convertir les données existantes sans perte (par exemple, si la longueur d'une colonne est diminuée et que les données doivent être tronquées).

Objets annexes à une ou plusieurs tables

Certains exemples de ces objets incluent des clés primaires, des contraintes de clé étrangère, des valeurs par défaut et des index.

  • Si un objet accessoire à une table existe dans le schéma source mais pas dans la base de données cible, elle doit être créée dans la base de données cible. Comme ci-dessus, pour la création de nouvelles colonnes de table, l'outil doit être capable de gérer des scénarios impliquant d'éventuels conflits ou erreurs d'ajout de l'objet auxiliaire. Il est parfaitement normal que l'outil laisse simplement le soin aux personnes qui gèrent le code de schéma de s'assurer que tous les conflits ou erreurs sont traités correctement - il est tout à fait valable pour l'outil de quitter le rapport d'échec s'il rencontre un conflit ou une erreur comme celui-ci.
  • Si un objet accessoire à une table n'existe pas dans le schéma source mais existe dans la base de données cible, l'outil doit fournir des moyens pour spécifier si l'objet auxiliaire doit être déposé dans la base de données cible. [Ce paramètre peut s'appliquer à tous ces objets.]
  • Si le même objet 1 existe à la fois dans le schéma source et dans la base de données cible, l'outil doit changer (ou supprimer et recrée) l'objet dans la base de données cible pour correspondre au schéma source.

Autres objets

Par «autre objet», je fais référence à des objets tels que des vues, des procédures stockées, des fonctions définies par l'utilisateur, etc. Ces objets peuvent généralement (?) être en toute sécurité supprimés et recréés. Un outil recommandé doit être capable de déposer et de recréer ces objets dans l'ordre nécessaire pour les objets qui dépendent d'autres objets de ce type (par exemple, une vue faisant référence à une autre vue).

  • Si un autre objet, etc., existe dans le schéma source mais pas dans la base de données cible, il doit être créé dans la base de données cible.
  • Si un autre objet comme une vue, bla bla bla, pas existe dans le schéma source mais existe dans la base de données cible, l'outil devrait fournir un moyen de spécifier si l'autre objet de la base de données cible doit être supprimé. [Ce paramètre peut s'appliquer à tous ces autres objets.]
  • Si l'un de ces objets existe à la fois dans le schéma source et dans la base de données cible, l'outil doit modifier (ou supprimer et recréer) l'objet dans le base de données cible pour correspondre au schéma source.

Données statiques

Les lignes de la table avec des données «statiques» à synchroniser doivent être identifiées par les valeurs des colonnes du clé primaire pour cette table.

Les lignes des tables de données statiques de la base de données cible doivent être modifiées pour correspondre au schéma source. Les lignes du schéma source qui ne figurent pas dans la table cible doivent être insérées dans la table cible. Ce serait bien si l'outil fournissait un moyen de spécifier si les lignes qui existent dans la table cible et qui n'existent pas dans le schéma source doivent être supprimées.

Notes

1 C'est en fait un point potentiellement subtil! La plupart des outils implémenteront probablement la «similitude» pour les objets de base de données comme ayant le même nom . Mais il existe des alternatives, au moins pour certains SGBD, par exemple dans SQL Server, les propriétés étendues peuvent être utilisées pour implémenter une forme d'identité persistante pour les objets de base de données qui est indépendante du nom de l'objet. Ce serait pratique car alors l'outil serait capable de gérer automatiquement (au moins certains) cas où les objets sont renommés.

2 J'ai posé des questions sur SQL Server spécifiquement, mais à ceci point J'adorerais vraiment que quelqu'un fournisse une réponse à cette question, quel que soit le SGBD.

Deux réponses:
Steve Kallestad
2014-02-19 08:09:46 UTC
view on stackexchange narkive permalink

Il y a quelques options devant vous.

Liquibase (Free, Apache License) est la seule option gratuite que je connaisse qui prend en charge SQL Server. Il s'agit de son propre package de contrôle de source, ce qui signifie que vous devrez apprendre un autre ensemble de commandes et comprendre le branchement, la fusion, etc. Le bonus pour Liquibase est que si vous connaissez Java, vous pouvez créer votre propre automatisation en utilisant les bibliothèques Liquibase .

Offscale (licence gratuite et non spécifiée) va un peu plus loin en vous permettant également de contrôler la source des ensembles de données, de faire des tests automatisés d'un modèle donné avec un ensemble de données de test. Malheureusement, aucune prise en charge de SQL Server.

Redgate SQL Source Control est une option commerciale intéressante. Il prend en charge SQL Server, Oracle, etc. et une variété de plates-formes de contrôle de source éprouvées (svn, git, mercurial, perforce, etc.). Il prend également en charge la gestion des versions des données. Ils ont un produit compagnon pour une intégration continue (déploiement automatisé) et une variété d'autres outils dans le même espace. Un peu trop cher pour un usage personnel à mon avis, mais très peu coûteux pour un usage en entreprise. Il y a un essai gratuit.

OffScale semble avoir disparu. Non seulement le site Web est en panne, mais [l'instantané le plus récent mis en cache] (https://web.archive.org/web/20180315061844/http://off-scale.com/) semble de toute façon avoir été mis à jour pour la dernière fois en 2012 .
Kenny Evitt
2014-02-05 22:17:03 UTC
view on stackexchange narkive permalink

DB Ghost

Présentation

Les produits DB Ghost satisfont les exigences.

Le produit Change Manager peut générer des scripts ( scripts DROP et CREATE , qui peuvent être exécutés «manuellement») pour tous les objets de schéma ainsi que les données statiques. Le produit Change Manager Professional peut être automatisé pour ce faire via la ligne de commande, par ex. pour créer régulièrement des scripts d'une base de données de développement particulière.

Les produits Packager, Packager Plus et Packager Plus Professional peuvent déployer des modifications sous la forme d'une version spécifique des scripts créés par Change Manager. Packager Plus peut effectuer une «mise à niveau dynamique», essentiellement un schéma et une «synchronisation» de données statiques entre une base de données cible et une base de données source, où la base de données source peut être créée à partir de scripts. Packager Plus peut également créer un exécutable qui peut être distribué pour effectuer la mise à niveau dynamique dans l'environnement cible concerné. Packager Plus Professional peut être automatisé pour faire tout ce qui précède via la ligne de commande.

«Synchronisation» ou migration

Une stratégie courante pour maintenir les modifications d'un schéma de base de données consiste à maintenir explicitement les migrations de base de données, à la fois pour la mise à niveau et pour la rétrogradation. Une migration est en fait un code permettant d'effectuer une seule modification sur une instance de base de données d'un schéma.

Vous pouvez maintenir les migrations avec DB Ghost, mais cela ne permet que vous le faites, cela ne le supporte certainement pas au-delà de cela. Cependant, je pense que c'est une bonne chose.

Au lieu de migrer les bases de données lors d'un déploiement, DB Ghost «synchronise» la base de données cible (la base de données sur laquelle vous souhaitez déployer les modifications) avec une base de données source modèle qui est généré lors du déploiement à partir d'une version spécifique du schéma de base de données. Au lieu d'exécuter des migrations spécifiques, il compare les bases de données source et cible et apporte les modifications nécessaires à la base de données cible pour résoudre les différences détectées.

Le principal avantage de la synchronisation par rapport à la migration est qu'au lieu de maintenir tous les scripts pour toutes les migrations, on peut (principalement) maintenir des scripts pour la version actuelle de tous les objets de base de données dans le schéma . Ainsi, le code qui représente le schéma est organisé par objet de base de données au lieu d'être réparti sur un nombre (potentiellement important) de migrations.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...