Per realizzare la versione 2 di un applicativo web, ho avuto la necessità di accedere al database in versione 1 e 2. I due db condividevano quasi totalmente la struttura delle tabelle, ma con alcune differenze nel numero di campi.
L'idea è stata quella di spostare sul db la logica di selezione dei dati, lasciando vedere all'applicativo web delle viste sui dati effettivi.
Primo passaggio, attribuire ad un utente (o meglio, ad uno schema) i permessi di accesso su tutte le tabelle interessate.
Secondo passaggio, creare le query di tipo Union.
A questo punto, il mio collaboratore mi ha chiesto se fare delle Union semplici oppure delle Union All.
E' necessario individuare la differenza tra le due tipologie.
select <campi> from <table>
union [all]
select <campi> from <table>
Con la Union semplice otteniamo tutti i record che non siano ripetuti in entrambe le tabelle, con la All otteniamo tutti i record, senza alcun controllo.
In questo caso, abbiamo utilizzato delle Union semplici proprio per evitare di selezionare record importati dalla versione 1 alla versione 2.
Terzo passaggio, creare le viste con le query del punto 2.
create or replace view <nome_vista> as
select <campi> from <table>
union [all]
select <campi> from <table>
Tornando alle query Union, è necessario notare che il numero di campi delle due select di cui è composta dev'essere uguale. Ma alcune tabelle dalla versione 1 alla versione 2 si sono arricchite di ulteriori campi. Per questi casi, abbiamo usato
null as <nome_campo_tabella_v2>
Ma avremmo potuto anche impostare, analogamente, un valore di default per il nuovo campo.