8

Je développe une application multi-locataire. J'ai choisi l'approche "Shared Database/Separate Schemas".Comment mettre à jour dans une application Multi Locataire tous les schémas de tous les locataires?

Mon idée est d'avoir un schéma par défaut (dbo) et lors du déploiement de ce schéma, faire une mise à jour sur les schémas des locataires (tenantA, tenantB, tenantC); en d'autres termes, pour faire des schémas synchronisés.

Comment synchroniser les schémas de locataires avec le schéma par défaut?

J'utilise SQL Server 2008.

Répondre

5

La première chose dont vous aurez besoin est une table ou un autre mécanisme pour stocker les informations de version du schéma. Si rien d'autre, vous pouvez lier votre application et votre schéma ensemble. Il n'y a rien de plus pénible qu'une version de l'application contre le mauvais schéma — défaut, les données corrompant, etc.

L'application doit rejeter ou arrêt si ce ne est pas la bonne version — que vous pourriez obtenir un certain blowback lorsque son pas droit, mais vous protège contre le très mauvais jour où la base de données corrompt les données précieuses.

Vous aurez besoin d'un moyen de suivre les modifications telles que Subversion ou autre — à partir de SQL, vous pouvez exporter le schéma initial. De là, vous aurez besoin d'un mécanisme pour suivre les changements à l'aide d'un outil sympa tel que comparer SQL, puis suivre les changements de schéma et faire correspondre à une mise à jour du numéro de version dans la base de données cible. Nous conservons chaque delta dans un dossier distinct sous l'utilitaire de mise à niveau que nous avons construit. Cet utilitaire se connecte au serveur, lit les informations de version, puis applique les scripts de transformation de la version suivante dans la base de données jusqu'à ce qu'il ne trouve plus de scripts de mise à niveau dans son sous-dossier. Cela nous donne la possibilité de mettre à jour une base de données, quel que soit l'âge de la version actuelle. S'il y a des transformations de données uniques au locataire, celles-ci deviendront difficiles. Bien sûr, vous devriez toujours faire une sauvegarde de la base de données qui écrit dans un fichier externe de préférence avec un numéro de version identifiable humain afin que vous puissiez le trouver et le restaurer lorsque le (s) script (s) vont mal. Et finalement, il faudra juste prévoir comment récupérer et restaurer. J'ai vu qu'il y avait une sorte d'outil de mise à niveau de schéma dans le nouveau VS 2010 mais je ne l'ai pas utilisé. Cela pourrait aussi vous être utile.

+0

Je pensais utiliser un framework comme Migrator.Net ou RikMigrations. Donc, je peux dans mon Build Server créer une build qui obtient la dernière version et exécute une commande qui vérifie et met à jour mes schémas. Un problème que je vois est lorsque l'application a de nombreux locataires, ce processus de mise à jour des schémas sera lent et dangereux. Que pensez-vous? Merci Mike –

+0

Si vous pouvez fermer l'application pendant une fenêtre de maintenance, c'est le meilleur/le plus facile pas de soucis de mises à jour de données, etc., vous pouvez avoir plusieurs instances de sauvegarde et de migration contre vos serveurs sql. Ce que nous avons fait était de configurer une page de porte avant que les utilisateurs d'une version particulière ne soient redirigés vers un sereur/chemin particulier. Si une demande d'authentification vient dans ADN leur DB est marqué comme dans la mise à niveau, nous les redirige vers la page "down for maintenance" et ne pas les transmettre à l'application. une fois sa sauvegarde pour eux, ils peuvent être redirigés de l'authentification aux serveurs avec la nouvelle version – MikeJ

+0

J'ai regardé rikMigrations. Le bummer que j'ai vu était qu'il n'a pas un moyen de travailler avec les SP ou les vues, probablement parce que ces mises à jour quand un code DDL s'exécute. Nous incluons dans notre code actuel des scripts pour supprimer tous ces artefacts, puis les reconstruire pour le nouveau schéma. – MikeJ

1

Il n'y a pas de commande magique pour synchroniser les schémas pour autant que je sais. Vous auriez besoin d'utiliser un outil - soit construit en interne ou acheté (consultez Red Gate's SQL Compare et SQL Examiner - vous devez les modifier pour comparer les différents schémas).

La simple synchronisation peut souvent être une entreprise délicate. Si vous avez ajouté une colonne, devez-vous également remplir cette colonne avec des données? Si vous divisez une colonne en deux nouvelles colonnes, il doit y avoir un code de conversion pour quelque chose comme ça. Ma suggestion serait de faire un suivi très minutieux de tous les scripts que vous exécutez sur le schéma dbo et assurez-vous qu'ils s'exécutent également contre les autres schémas lorsque cela est approprié. Vous pouvez ensuite utiliser un outil tel que SQL Compare comme vérification ponctuelle pour rechercher des différences inattendues.

+1

Mon idée est d'automatiser ce processus. En utilisant un programme comme Red Compare SQL Compare, le processus sont manuels. Merci. –

+0

En fait, SQL Compare dispose d'une API ainsi que d'une fonctionnalité de ligne de commande, donc si les structures restent synchronisées ET (voici la partie importante quelle que soit la méthode utilisée) si vous pouvez définir des règles bien définies fonctionne, alors vous devriez être capable de l'automatiser avec SQL Compare. –