Come posso mantenere un aggiornamento dello schema SQL che viene inviato regolarmente ai nostri utenti?

2

Lavoro su un progetto che utilizza un database SQL come back-end e un'app desktop come front-end. Facciamo le pubblicazioni su base regolare e, come parte di una versione, il nostro cliente ha bisogno di aggiornare il proprio server SQL.

La nostra attività richiede che siamo aggiornabili dalla versione 1.x alla versione 1.y, e il modo in cui lo abbiamo fatto finora è seguire uno schema semplice per dozzine / centinaia di tabelle:

  • SE NON ESISTE (XXX) CREA TABELLA / VISUALIZZA YYY ...
  • ALTER TABLE (XXX) AGGIUNGI COLONNA (WWW) ...
  • CREATE INDEX (ZZZ) sulla tabella XXX (se necessario)
  • Quindi su ...

Il problema che vedo con questo è che i passaggi descritti sopra sono tutti strutturati in una relazione uno a uno con il tavolo che viene creato. Questo va bene per i database più semplici che non hanno vincoli, ma diventa un dolore quando chiavi estranee / trigger / qualcosa di complesso viene coinvolto.

Mi chiedevo se esistesse un modello che potesse aiutarmi a ripulire tutto e ad apportare modifiche al mio script più facilmente. Stavo pensando qualcosa sulla falsariga di seguire questi passaggi per ogni tabella nel database:

  • eseguire la pulizia da qualsiasi "vecchia" versione
  • crea / aggiorna tutte le tabelle / colonne (senza vincoli)
  • crea / aggiorna tutte le viste in base alle tabelle
  • crea / aggiorna tutte le chiavi esterne / i vincoli
  • crea / aggiorna tutti gli indici
  • crea / aggiorna tutti i trigger
  • ...

Uso uno strumento per unire tutti i file SQL nel mio repository in uno, ma la rima / ragione a cui il file viene unito a quel punto sta diventando poco chiaro - spesso mi arrendo e metto in discussione qualcosa che dice "include file X direttamente prima / dopo il file Y ". Sta diventando non gestibile (posso ancora risolvere i problemi, ma voglio essere in grado di trasferire questa responsabilità).

È l'ultima seccatura che voglio essere in grado di evitare. Voglio essere in grado di creare un nuovo tavolo semplicemente rilasciando uno script con il contenuto "CREATE TABLE X ..." in una directory "Tables" e richiamarlo.

Ci sono dei modelli là fuori che possono aiutarmi? Sto davvero cercando una sorta di munizione che posso usare quando la propongo ai miei colleghi dicendo "vedi - c'è una soluzione a questo cluster * e QUESTO è come le altre aziende lo affrontano".

    
posta Michael 28.05.2013 - 17:58
fonte

1 risposta

7

Questa è non originariamente la mia idea , ma ecco un modo manuale per farlo:

  1. Crea una directory "UpdateScripts".
  2. Crea un campo nel database che tiene traccia del numero ID dello script di ultima esecuzione.
  3. Ogni volta che qualsiasi modifica viene apportata alla struttura del database, salvala come uno script in quella directory, con un numero sequenziale (come 00001 ) in primo piano.
  4. Ogni volta che il cliente si avvia, esegui ogni script nell'ordine tra l'ID memorizzato e l'ultimo script nella directory.
  5. Aggiorna l'ultimo campo di script.

Ci sono un certo numero di alternative, la maggior parte più automatizzate di questo, discusse qui .

    
risposta data 28.05.2013 - 18:16
fonte

Leggi altre domande sui tag