330 votes

Versionnement de la base de données SQL Server

Je veux placer mes bases de données sous contrôle de version. Quelqu'un a-t-il des conseils ou des articles recommandés pour me permettre de commencer ?

Je voudrai toujours avoir au moins un peu de dans ces données (comme alumb mentions : types d'utilisateurs et administrateurs). Je souhaite aussi souvent disposer d'une grande collection de données de test générées pour mesurer les performances.

0 votes

Consultez également ce livre blanc : The Definitive Guide to Database Version Control (en anglais). www3.dbmaestro.com/

186voto

ESV Points 4591

Martin Fowler a écrit mon article préféré sur le sujet, http://martinfowler.com/articles/evodb.html . J'ai choisi de ne pas mettre les vidages de schéma sous contrôle de version car alumb et d'autres suggèrent parce que je veux un moyen facile de mettre à jour ma base de données de production.

Pour une application web où je disposerai d'une seule instance de base de données de production, j'utilise deux techniques :

Scripts de mise à jour de la base de données

Des scripts de mise à niveau de la base de données qui contiennent le DDL nécessaire pour faire passer le schéma de la version N à N+1. (Ils sont placés dans votre système de contrôle de version). Une table _version_history_, quelque chose comme

create table VersionHistory (
    Version int primary key,
    UpgradeStart datetime not null,
    UpgradeEnd datetime
    );

obtient une nouvelle entrée chaque fois qu'une mise à jour script s'exécute qui correspond à la nouvelle version.

Ainsi, il est facile de savoir quelle version du schéma de base de données existe et les scripts de mise à niveau de la base de données ne sont exécutés qu'une seule fois. Encore une fois, il s'agit no des décharges de la base de données. Plutôt, chaque script représente le changements nécessaires pour passer d'une version à l'autre. Ce sont les script que vous appliquez à votre base de données de production pour la "mettre à niveau".

Synchronisation du bac à sable du développeur

  1. Un script pour sauvegarder, assainir et réduire une base de données de production. Exécutez ce script après chaque mise à niveau de la base de données de production.
  2. Un script pour restaurer (et mettre au point, si nécessaire) la sauvegarde sur le poste de travail d'un développeur. Chaque développeur exécute ce script après chaque mise à jour de la BD de production.

Une mise en garde : mes tests automatisés s'exécutent sur une base de données au schéma correct mais vide. Ces conseils ne seront donc pas parfaitement adaptés à vos besoins.

17 votes

Le contrôle des versions des scripts de schémas complets est très utile à des fins de référence. Par exemple, il est impossible de voir ce qui a été modifié exactement dans une procédure stockée en regardant l'instruction ALTER PROCEDURE.

12 votes

L'extraction (et le versionnement) du schéma complet de la base de données après l'exécution de nouveaux scripts de mise à niveau est un bon moyen de mettre les informations à la disposition des autres outils de votre processus de construction/déploiement. De plus, le fait d'avoir le schéma complet dans un script signifie pouvoir "spin up" une nouvelle base de données sans passer par toutes les étapes de migration. Cela permet également de différencier la version actuelle des versions précédentes accumulées.

2 votes

Vous dites que vous mettez les scripts de mise à jour dans le contrôle de la source, mais que vous n'y mettez pas ceux de retour en arrière ?

45voto

Dane Points 3595

Le produit SQL Compare de Red Gate vous permet non seulement de faire des comparaisons au niveau des objets, et de générer des scripts de changement à partir de cela, mais il vous permet également d'exporter vos objets de base de données dans une hiérarchie de dossiers organisée par type d'objet, avec une création [nom de l'objet].sql script par objet dans ces répertoires. La hiérarchie par type d'objet est la suivante :

\Functions
\Security
\Security\Roles
\Security\Schemas
\Security\Users
\Stored Procédures
\Tables

Si vous déposez vos scripts dans le même répertoire racine après avoir effectué des modifications, vous pouvez l'utiliser pour mettre à jour votre repo SVN et conserver un historique de chaque objet individuellement.

6 votes

Nous venons de lancer SQL Source Control, qui intègre le comportement de SQL Compare que vous décrivez dans SSMS, et des liens vers SVN et TFS. J'ai ajouté une réponse séparée à cette question qui décrit plus en détail ce qu'il fait. red-gate.com/produits/SQL_Source_Control/index.htm

39voto

alumb Points 2586

C'est l'un des "problèmes difficiles" qui entourent le développement. Pour autant que je sache, il n'existe pas de solution parfaite.

Si vous avez uniquement besoin de stocker la structure de la base de données et non les données, vous pouvez exporter la base de données sous forme de requêtes SQL. (dans Enterprise Manager : Clic droit sur la base de données -> Generate SQL script. Je vous recommande de paramétrer l'option "create one file per object" dans l'onglet options) Vous pouvez ensuite commiter ces fichiers texte dans svn et utiliser les fonctions diff et logging de svn.

Je l'ai lié à un Batch script qui prend quelques paramètres et configure la base de données. J'ai également ajouté quelques requêtes supplémentaires qui entrent des données par défaut comme les types d'utilisateurs et l'utilisateur admin. (Si vous voulez plus d'informations à ce sujet, postez quelque chose et je peux mettre le script quelque part d'accessible).

Si vous avez besoin de conserver toutes les données, je vous recommande de faire une sauvegarde de la base de données et d'utiliser Redgate ( http://www.red-gate.com/ ) pour faire les comparaisons. Ils ne sont pas bon marché, mais ils valent chaque centime.

1 votes

Concernant les données - vous pouvez utiliser DataGrove hors échelle pour sauvegarder des versions de votre BD entière (données incluses). Vous pouvez ensuite l'utiliser pour créer deux copies virtuelles de votre BD qui peuvent être comparées avec le produit de red-gate. Cela vous évite également de devoir générer des données de test - vous pouvez simplement sauvegarder des versions de la base de données pour correspondre aux différents cas de test (encore une fois, des copies virtuelles complètes de la base de données entière).

1 votes

Comment déterminer l'ordre d'exécution des scripts de la base de données si vous utilisez l'option "un fichier par objet" ?

0 votes

@Taichman : DataGrove ne semble pas prendre en charge SQL server, et en tant que tel n'a aucune pertinence pour la question.

25voto

David Atkinson Points 2465

Ici, à Red Gate, nous proposons un outil, Contrôle des sources SQL qui utilise la technologie SQL Compare pour relier votre base de données à un référentiel TFS ou SVN. Cet outil s'intègre à SSMS et vous permet de travailler comme vous le feriez normalement, sauf qu'il vous permet maintenant de livrer les objets.

Pour une approche basée sur les migrations (plus adaptée aux déploiements automatisés), nous proposons Automatisation des changements SQL (anciennement appelé ReadyRoll), qui crée et gère un ensemble de scripts incrémentiels en tant que projet Visual Studio.

Dans SQL Source Control, il est possible de spécifier des tables de données statiques. Celles-ci sont stockées dans le Source Control en tant qu'instructions INSERT.

Si vous parlez de données de test, nous vous recommandons soit de générer des données de test avec un outil ou via un script post-déploiement que vous définissez, soit de restaurer simplement une sauvegarde de production dans l'environnement de dev.

0 votes

Produit intéressant (il y a un peu de vide sur le marché) mais les deltas stockés comme "CREER..." me font peur. Comment procédez-vous à l'embranchement/à la fusion ?

1 votes

Nous stockons les définitions d'objets sous la forme CREATE, mais si vous utilisez la fonction "get latest" ou, par exemple, SQL Compare Pro pour générer des scripts de synchronisation, elles sont remplacées par les commandes appropriées, telles que ALTER. Pour créer des branches ou fusionner, il vous suffit d'utiliser votre système de contrôle de la source de la même manière que vous le faites actuellement.

0 votes

Cette réponse est une duplication de la réponse de Dane postée deux ans plus tôt.

22voto

jeffjakub Points 88

Vous pouvez vous intéresser à Liquibase ( http://www.liquibase.org/ ). Même si vous n'utilisez pas l'outil lui-même, il gère assez bien les concepts de gestion des changements de base de données ou de refactoring.

0 votes

Nous utilisons Liquibase dans 5 équipes distribuées sur une seule branche pour la livraison continue et cela fonctionne très bien. Nous avons plus de 10 applications de base de données installées sur de nombreux environnements différents. Nous l'utilisons pour gérer les schémas, l'indexation, le partitionnement, le code, les données de consultation, les groupes et les autorisations de groupe. Nous l'utilisons pour Oracle, Postgresql et MSSQL.

0 votes

Si je comprends bien d'après l'introduction, il faut connaître un langage xml propriétaire pour déclarer ses objets au lieu de SQL ? Je ne suis pas fan.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X