8

Sto sviluppando un'applicazione multi-tenant. Ho scelto l'approccio "Database condiviso/schemi separati".Come aggiornare in un'app Multi Tenant tutti gli schemi di tutti gli inquilini?

La mia idea è quella di avere uno schema predefinito (dbo) e durante la distribuzione di questo schema, per fare un aggiornamento su schemi degli inquilini (tenantA, tenantB, tenantC); in altre parole, per fare schemi sincronizzati.

Come posso sincronizzare gli schemi dei tenant con lo schema predefinito?

Sto usando SQL Server 2008.

risposta

5

Per prima cosa è necessaria una tabella o un altro meccanismo per memorizzare le informazioni sulla versione dello schema. Se non altro, puoi legare insieme la tua applicazione e lo schema. Non c'è niente di più doloroso di una versione dell'applicazione contro il male schema — difetto, i dati corrompere, ecc

L'applicazione dovrebbe rifiutare o l'arresto se non la versione giusta — si potrebbe ottenere qualche contraccolpo quando il suo non è giusto, ma ti protegge dal giorno davvero brutto in cui il database danneggia i dati preziosi.

Avrete bisogno di un modo per tenere traccia delle modifiche come Subversion o qualcos'altro — da SQL è possibile esportare lo schema iniziale. Da qui avrete bisogno di un meccanismo per tenere traccia delle modifiche utilizzando uno strumento piacevole come il confronto SQL e quindi tracciare le modifiche dello schema e associarlo a un aggiornamento nel numero di versione nel database di destinazione.

Manteniamo ogni delta in una cartella separata sotto l'utilità di aggiornamento che abbiamo creato. Questa utility si collega al server, legge le informazioni sulla versione e quindi applica gli script di trasformazione dalla versione successiva nel database fino a quando non trova più script di aggiornamento nella sottocartella. Questo ci dà la possibilità di aggiornare un database, non importa quanti anni ha con la versione corrente. Se ci sono trasformazioni di dati univoche l'inquilino, queste diventeranno difficili.

Ovviamente si dovrebbe sempre fare un backup del database che scrive su un file esterno preferibile con un numero di versione umano identificabile in modo da poterlo trovare e ripristinarlo quando lo script (i) va a male. E alla fine sarà così solo in programma di capire come recuperare e ripristinare.


Ho visto che c'è una sorta di strumento di aggiornamento dello schema nel nuovo VS 2010 ma non l'ho usato. Potrebbe anche esserti utile.

+0

Stavo pensando di utilizzare un framework come Migrator.Net o RikMigrations. Quindi, nel mio Build Server posso creare una build che ottiene la versione più recente ed esegue un comando che controlla e aggiorna i miei schemi. Un problema che vedo è quando l'applicazione ha molti tenant, questo processo di schemi di aggiornamento sarà lento e pericoloso. Cosa ne pensi? Grazie Mike –

+0

Se è possibile chiudere l'app durante una finestra di manutenzione, questo è il migliore/più semplice. non preoccuparti degli aggiornamenti dei dati, ecc. puoi avere più istanze di backup e migrazione verso i tuoi server sql. quello che abbiamo fatto è stato l'installazione di una porta principale piuttosto che quella di reindirizzare gli utenti di una particolare versione a un particolare serer/percorso. Se viene inoltrata una richiesta di autenticazione, il loro db è contrassegnato come nell'upgrade, li reindirizziamo alla pagina "down for maintenance" e non li passiamo all'app. una volta eseguito il backup, possono essere reindirizzati dall'autenticazione ai server con la nuova versione – MikeJ

+0

Ho esaminato rikMigrations. Il guaio che ho visto è che non ha modo di lavorare con SP o Views, probabilmente perché questi aggiornamenti quando viene eseguito un codice DDL. includiamo nel nostro attuale codice script per eliminare tutte queste risorse e quindi ricostruirle per il nuovo schema. – MikeJ

1

Non v'è alcun comando di magia per sincronizzare gli schemi per quanto ne so. Avresti bisogno di usare uno strumento - costruito in casa o acquistato (dai un'occhiata a Red Gate's SQL Compare e SQL Examiner - devi modificarli per confrontare diversi schemi).

Solo la sincronizzazione può spesso essere un affare complicato. Se hai aggiunto una colonna, devi riempire anche quella colonna con i dati? Se dividi una colonna in due nuove colonne deve esserci un codice di conversione per qualcosa di simile.

Il mio suggerimento sarebbe quello di tracciare con molta attenzione tutti gli script che si eseguono sullo schema dbo e assicurarsi che anche loro vengano eseguiti contro gli altri schemi quando appropriato. È quindi possibile utilizzare uno strumento come SQL Compare come controllo di sanità occasionale per cercare eventuali differenze impreviste.

+1

La mia idea è di automatizzare questo processo. Usando un programma come SQL Compare di Red Gate, il processo è manuale. Grazie. –

+0

In realtà, SQL Compare ha un'API e anche una funzionalità da riga di comando, quindi se è solo mantenere le strutture sincronizzate E (ecco la parte importante indipendentemente dal metodo che si usa) se si possono trovare regole ben definite su come la sincronizzazione funziona, quindi dovresti essere in grado di automatizzarlo con SQL Compare. –