J'y ai travaillé moi-même, et je peux vous dire que ce n'est pas facile.
Tout d'abord, pour répondre à la réponse de JT - vous ne pouvez pas ignorer les "versions", même avec les mécanismes de mise à jour déclarative que SSDT possède. SSDT fait un travail "assez décent" (à condition que vous connaissiez tous les commutateurs et les pièges) pour déplacer n'importe quel schéma source vers n'importe quel schéma cible, et il est vrai que cela ne nécessite pas de version en soi, mais il n'a aucune idée de la façon de gérer le "mouvement des données" (du moins pas à ma connaissance !). Donc, tout comme DBProj, vous êtes laissé à vos propres moyens dans les scripts Pre/Post. Parce que les scripts de mouvement de données dépendent d'un état de schéma de début et de fin connu, vous ne pouvez pas éviter de versionner la BD. Les scripts "data motion" doivent donc être appliqués à un instantané versionné du schéma, ce qui signifie que vous ne pouvez pas arbitrairement mettre à jour une BD de v1 à v8 et espérer que les scripts data motion v2 à v8 fonctionnent (vraisemblablement, vous n'auriez pas besoin d'un script data motion v1).
Malheureusement, je ne vois aucun mécanisme dans la publication SSDT qui me permette de gérer ce scénario de manière intégrée. Cela signifie que vous devrez ajouter votre propre scafolding.
La première astuce consiste à suivre les versions au sein de la base de données (et du projet SSDT). J'ai commencé à utiliser une astuce dans DBProj, et je l'ai transposée dans SSDT, et après avoir fait quelques recherches, il s'avère que d'autres l'utilisent aussi. Vous pouvez appliquer une propriété étendue DB à la base de données elle-même (appelez-la "BuildVersion" ou "AppVersion" ou quelque chose comme ça), et lui appliquer la valeur de la version. Vous pouvez ensuite capturer cette propriété étendue dans le projet SSDT lui-même, et SSDT l'ajoutera comme un script (vous pouvez alors cocher l'option de publication qui inclut les propriétés étendues). J'utilise ensuite les variables SQLCMD pour identifier les versions source et cible appliquées dans la passe actuelle. Une fois que vous avez identifié le delta des versions entre la source (snapshot du projet) et la cible (db cible sur le point d'être mis à jour), vous pouvez trouver tous les snapshots qui doivent être appliqués. Malheureusement, ceci est délicat à faire à partir de à l'intérieur de le déploiement SSDT, et vous devrez probablement le déplacer vers le pipeline de construction ou de déploiement (nous utilisons les déploiements automatisés TFS et avons des actions personnalisées pour le faire).
L'étape suivante consiste à conserver des instantanés du schéma avec les scripts de mouvement de données associés. Dans ce cas, il est utile de rendre les scripts aussi idempotents que possible (ce qui signifie que vous pouvez réexécuter les scripts sans effets secondaires indésirables). Il est utile de séparer les scripts qui peuvent être réexécutés en toute sécurité des scripts qui doivent être exécutés une seule fois. Nous faisons la même chose avec les données de référence statiques (dictionnaire ou tables de consultation) - en d'autres termes, nous avons une bibliothèque de scripts MERGE (un par table) qui maintiennent la synchronisation des données de référence, et ces scripts sont inclus dans les scripts post-déploiement (via la commande SQLCMD :r). La chose importante à noter ici est que vous doit les exécuter dans l'ordre correct au cas où l'une de ces tables de référence aurait des références FK entre elles. Nous les incluons dans l'ordre dans le script principal post-déploiement, et cela aide que nous ayons créé un outil qui génère ces scripts pour nous - il résout également l'ordre des dépendances. Nous exécutons cet outil de génération à la clôture d'une "version" pour capturer l'état actuel des données de référence statiques. Tous vos autres scripts de mouvement de données seront essentiellement des cas particuliers et très probablement à usage unique. Dans ce cas, vous pouvez faire l'une des deux choses suivantes : vous pouvez utiliser une instruction IF par rapport à la version du db build/app, ou vous pouvez effacer les scripts à usage unique après avoir créé chaque paquet d'instantanés.
Il est utile de se rappeler que SSDT désactivera les contraintes de contrôle FK et ne les réactivera qu'après l'exécution des scripts post-déploiement. Cela vous donne la possibilité de remplir de nouveaux champs non nuls, par exemple (en passant, vous devez activer l'option de génération de valeurs par défaut "intelligentes" temporaires pour les colonnes non nulles pour que cela fonctionne). Cependant, les contraintes de contrôle FK ne sont désactivées que pour les tables que SSDT recrée en raison d'un changement de schéma. Pour les autres cas, vous devez vous assurer que les scripts de mouvement de données sont exécutés dans le bon ordre pour éviter les plaintes relatives aux contraintes de contrôle (ou vous devez les désactiver/activer manuellement dans vos scripts).
DACPAC peut vous aider car DACPAC est essentiellement un instantané. Il contient plusieurs fichiers XML décrivant le schéma (similaire à la sortie de construction du projet), mais figé dans le temps au moment où vous le créez. Vous pouvez ensuite utiliser SQLPACKAGE.EXE ou le fournisseur de déploiement pour publier cet instantané de paquet. Je n'ai pas encore trouvé comment utiliser le versioning de DACPAC, car il est plus lié aux applications de données "enregistrées", donc nous sommes coincés avec notre propre schéma de versioning, mais nous mettons nos propres informations de version dans le nom de fichier DACPAC.
J'aimerais avoir un exemple plus concluant et plus probant à fournir, mais nous sommes encore en train de régler les problèmes ici aussi.
Une chose qui craint vraiment à propos de SSDT est que, contrairement à DBProj, il n'est actuellement pas extensible. Bien qu'il fasse un bien meilleur travail que DBProj pour beaucoup de choses différentes, vous ne pouvez pas modifier son comportement par défaut à moins que vous ne trouviez une méthode dans les scripts pré/post pour contourner un problème. L'un des problèmes que nous essayons de résoudre en ce moment est que la méthode par défaut de recréation d'une table pour les mises à jour (CCDR) est vraiment nulle lorsque vous avez des dizaines de millions d'enregistrements.
MISE À JOUR : Je n'ai pas vu ce message depuis un certain temps, mais apparemment il a été actif dernièrement, alors j'ai pensé ajouter quelques notes importantes : si vous utilisez VS2012, la version de juin 2013 de SSDT a maintenant un outil de comparaison de données intégré, et fournit également des points d'extensibilité - c'est-à-dire que vous pouvez maintenant inclure des contributeurs de construction et des modificateurs de plan de déploiement pour le projet.