Documentazione/HowTo/MigrareDaHSQLDB
TDF LibreOffice Document Liberation Project Blog comunitari Weblate Nextcloud Redmine Ask LibreOffice Donazione
La versione 6.1 di LibreOffice sostituirà gradualmente il motore di database interno HSQLDB con il motore interno Firebird. Innanzitutto, questo si può notare dal fatto che i database Firebird già esistenti, non richiedono più di attivare le funzionalità sperimentali.
Se in LibreOffice sono attivate le funzionalità sperimentali, quando accedete ad un database HSQLDB, appare la seguente finestra di dialogo:
Fintantoché non avrete preso tutte le precauzione di seguito indicate, dovreste scegliere
.- Fate una copia di backup del fine contenente il database HSQLDB.
- Copiate il codice SQL delle viste e salvatele come query. Regolate queste ultime e salvatele nuovamente come viste. Al momento, con Firebird, le viste non possono essere modificate!
- In Firebird i nomi delle tabelle e delle colonne possono essere lunghi al massimo 31 caratteri. Se necessario adeguateli.
- A causa di un bug, in tutte le tabelle i campi data, ora e data/ora devono essere sostituite da un campo che ne memorizza il contenuto come testo.
- A causa di un bug, dopo la migrazione, le immagini, che venivano lette in HSQLDB, non vengono visualizzate nel database Firebird.
- Le tabelle di puro testo (tabelle * .csv incorporate ecc.) con Firebird non sono possibili.
Migrare i campi data, orario e data/orario
La procedura guidata di migrazione non gestisce correttamente i campi data, ora e data/ora. Ciò è dovuto al fatto che HSQLDB lavora con il fuso orario locale. Durante la migrazione le date e gli orari improvvisamente si trasformano, portando gli orari estivi due ore indietro e solo un'ora indietro quelli invernali. Le data vengono spostate di un giorno avanti e così via. Il metodo seguente aiuta ad estrarre i valori corretti da database HSQLDB portandoli in quello in Firebird, per poi ricreare i valori delle ore e delle date:
1. Nelle tabelle in HSQLDB che contengono campi data, ora e data/ora aggiungete, per ciascuno di essi, un campo VARCHAR:
"Data_T" VARCHAR (10), "Ora_T" VARCHAR (8), "DataOra_T" VARCHAR (19)
2. Eseguite il seguente comando da
▸ :UPDATE "Tabella" SET "Data_T" = CAST ("Data" AS VARCHAR (10)); UPDATE "Tabella" SET "Ora_T" = CAST ("Ora" AS VARCHAR (8)); UPDATE "Tabella" SET "DataOra_T" = LEFT (CAST ("DataOra" AS VARCHAR (30)), 19);
3. Una volta che nelle tabelle tutti i campi sono disponibili anche come campi di testo, potete procedere con la migrazione. Conseguentemente, dopo aver migrato il database in Firebird è necessario aggiornarlo di nuovo:
UPDATE "Tabella" SET "Data" = "Data_T"; UPDATE "Tabella" SET "Ora" = "Ora_T"; UPDATE "Tabella" SET "DataOra" = "DataOra_T";
Dopo questa azione, i valori tratti dal database HSQLDB sono disponibili anche nei campi corrispondenti del nuovo database in Firebird. Potete cancellare i campi "Data_T", "Ora_T" e "DataOra_T".
Rendere le immagini memorizzate nelle tabelle visibili e modificabili nei formulari
La procedura guidata di migrazione crea dei campi del tipo
in sostituzione dei campi che contenevano immagini nel database HSQLDB ( ). Questo tipo di campo è presente nell'interfaccia grafica, ma probabilmente non viene collegato al tipo corretto di dati. Al fine di rendere visibili nuovamente queste immagini, queste vanno copiate in un campo di tipo , in modo che all'interno dei formulari sia possibile la visualizzazione e la modifica del contenuto dell'immagine. I Rapporti (Report) attualmente non sono in grado di visualizzare le immagini memorizzate in un database Firebird.Anche quando l'utente non ha apportato alcuna modifica ad un campo immagine, appare un messaggio che avverte che non è possibile apportare modifiche, ma che la colonna può essere cancellata e ricreata. È meglio selezionare
, altrimenti i dati memorizzati in quel campo saranno persi.1. Nelle tabelle che contengono immagini è necessario inserire un campo di tipo BLOB: "Immagine_N" BLOB [BLOB]
2. Se il salvataggio non permette di modificare il tipo di dati del campo immagine creato durante l'importazione.
3. Eseguite il seguente comando da
▸ :UPDATE "Tabella" SET "Immagine_N" = "Immagine";
4. Aprite la finestra di modifica della tabella, eliminate la vecchia colonna "Immagine" e non permettete che il tipo di dati del nuovo campo immagine venga modificato dalla cancellazione del campo.
5. Aprite la finestra di modifica della tabella, aggiungete una nuova colonna "Immagine" e non permettete che il tipo di dati di un campo immagine venga modificato dall'inserimento del campo.
6. Eseguite il seguente comando da
▸ :UPDATE "Tabella" SET "Immagine" = "Immagine_N";
7. Aprite la finestra di modifica della tabella, eliminate la colonna "ImmagineN" e non permettete che il tipo di dati del nuovo campo immagine venga modificato dalla cancellazione del campo.
Bug nella migrazione dei formulari secondari e dei parametri delle query
A causa di un bug in fase di migrazione, i parametri delle query ed i formulari secondari non funzionano correttamente. Sfortunatamente per correggere questo errore è necessario decomprimere il file contenente il database e modificare il file content.xml. All'interno di questo file è erroneamente indicato:
db: parameter-name-substitution = "false"
Un tanto va modificato in:
db: parameter-name-substitution = "true"
oppure potete immediatamente rimuoverlo del tutto. Dopodiché il file content.xml può essere inserito nuovamente nel file del database.
Contenuti del file * .odb dopo la migrazione
Durante la migrazione i contenuti del database HSQLDB non vengono rimossi dal file * .odb:
Dopo la migrazione, all'interno del file del database, nella sottocartella "database", in aggiunta ai file di HSQLDB, è presente il file "firebird.fbk". Questo file contiene i dati derivanti dalla migrazione e, quando viene aperto il database, viene scompattato all'interno della cartella dei file temporanei del sistema.
Anche le impostazioni precedenti che si trovavano nel file content.xml vengono preservate. Il file corrispondente viene semplicemente rinominato in "content_before_migration.xml". Per poter accedere nuovamente ai dati in HSQLDB, dovete rinominare il nuovo "content.xml" in "content_new.xml" ed il file "content_before_migration.xml" in "content.xml".
Una volta che la migrazione è andata a buon fine, potete cancellare il file "content_before_migration.xml" ed i file "backup", "data", "properties" e "script" che si trovano nella cartella "database". Naturalmente ciò è raccomandato, se già prima il database era piuttosto esteso. In sostanza, durante la migrazioni i dati vengono duplicati.
Personalizzare le funzioni nelle query
Nelle query, molte funzioni hanno lo stesso nome e funzionano allo stesso modo sia in HSQLDB, sia in Firebird. Nonostante ciò, quando aprite una query che precedentemente funzionava in HSQLDB, potrebbe capitarvi che compaia un messaggio come il seguente:
La funzione IFNULL in Firebird è sconosciuta. Una scorsa all'elenco qui di seguito evidenzia che al suo posto potete usare la funzione COALESCE sia in Firebird, sia in HSQLDB. Per di più questa funzione è maggiormente universale in quanto può eseguire ricerche su qualsiasi numero di valori e restituisce il valore della prima occorrenza che non è NULL. Sfortunatamente, l'editor SQL di Base non è in grado di passare un termine alla funzione
. Se ciò fosse possibile, nei casi in cui il termine si ripete spesso in una query, potreste semplicemente sostituire IFNULL con COALESCE. Perciò, per questo tipo di trasformazioni,è consigliabile copiare la query in un semplice editor di testo dotato della funzione di ricerca e sostituzione, eseguire la sostituzione e quindi sovrascrivere il vecchio contenuto con il risultato.La faccenda è più complicata nel caso in cui compaia il seguente messaggio:
Il messaggio di errore per ora è privo di significato. Non contiene dettagli utili. In questo caso è comparso per la prima volta quando ha trovato la funzione SUBSTRING in una query. Questa funzione è conosciuta anche in Firebird, ma quest'ultimo non permette la notazione abbreviata con i valori separati da virgole, che invece è possibile con HSQLDB. Dovete riscriverla come SUBSTRING (s FROM start [FOR len])
La tabella seguente fornisce una panoramica di quali funzioni potrebbero richiedere degli aggiustamenti, poiché in Firebird non hanno lo stesso nome oppure, nel peggiore dei casi, non esistono proprio. L'elenco non dice nulla riguardo al fatto che Firebird possiede un numero inferiore di funzioni rispetto al motore interno HSQLDB. Semplicemente per alcune funzioni non ne esiste una che possa sostituirla.
Una funzione che compare nella colonna HSQLDB e Firebird può essere sostituita già prima della migrazione. Un esempio è la combinazione di più stringhe: sia CONCAT, sia la combinazione con l'uso del segno '+', possono essere sostituiti dall'uso dei segni '||'. Questo tipo di concatenamento funziona in entrambi i motori interni di database. Il funzionamento successivo di HSQLDB non è influenzato da questa modifica.
Una funzione che compare solo sotto HSQLDB o solo sotto Firebird, ma non nella colonna centrale, non può ancora essere sostituita. Per questo motivo il database dovrà essere migrato. Il codice delle viste contente una di queste funzioni deve essere memorizzato da qualche altra parte - ad esempio come query. La modifica del codice è possibile solo dopo la migrazione.
Alcune funzioni non possono essere migrate. Queste sono indicate dalle note contrassegnate in rosso.
Funzioni nei motori di database HSQLDB e Firebird
La prima colonna mostra le funzioni di HSQLDB, che non sono disponibili in Firebird. La seconda colonna mostra le funzioni, che funzionano in HSQLDB e in Firebird con lo stesso risultato. La terza colonna mostra le funzioni di Firebird, che devono essere scelte in sostituzione di quelle di HSQLDB. Queste funzioni forniscono lo stesso risultato di quelle di HSQLDB riportate nella stessa riga, ma non sono disponibili con lo stesso nome di funzione che hanno in HSQLDB.
NUMERICHE | ||
HSQLDB | HSQLDB e Firebird | Firebird |
---|---|---|
BITAND(a,b) | BIN_AND(a,b) | |
BITOR(a,b) | BIN_OR(a,b) | |
BITXOR(a,b) | BIN_XOR(a,b) | |
DEGREES(d) | <valore in radianti>*360/(2*PI()) | |
LOG(d) | LN(d) | |
RADIANS(d) | <valore in gradi>*2*PI()/360 | |
ROUNDMAGIC(d) | Nessuna funzione | |
TRUNCATE(a,b) | TRUNC(a,b) | |
TESTO | ||
HSQLDB | HSQLDB e Firebird | Firebird |
ASCII(s) | ASCII_VAL(s) | |
BIT_LENGTH(s) | Restituisce la lunghezza del testo. HSQLDB: 16bit per carattere Firebird: 8bit, carattere speciale 16bit. Stesso nome, conteggio differente! | BIT_LENGTH(s) |
CHAR(c) | ASCII_CHAR(c) | |
CONCAT(str1,str2)
'str1'+'str2'+'str3' |
'str1'‖'str2'‖'str3' | |
DIFFERENCE(s1,s2) | Nessuna funzione | |
HEXTORAW(s) | Nessuna funzione | |
INSERT(s1,start,len,s2) | OVERLAY(s1 PLACING s2 FROM start [FOR len])
Non funziona nell'interfaccia grafica delle query | |
LCASE(s) | LOWER(s) | |
LENGTH(s) | CHAR_LENGTH(s)
CHARACTER_LENGTH() |
|
LOCATE(search,s[,start]) | POSITION(search IN s) | POSITION(search,s[,start]) |
LTRIM(s) | TRIM(LEADING FROM s) | |
OCTET_LENGTH(s) | Stesso nome, conteggio differente! | |
RAWTOHEX(s) | Nessuna funzione | |
REPEAT(s,count) | Nessuna funzione | |
RTRIM(s) | TRIM(TRAILING FROM s) | |
SOUNDEX(s) | Nessuna funzione | |
SPACE(count) | Nessuna funzione | |
SUBSTR(s,start[,len])
SUBSTRING(s,start[,len]) |
SUBSTRING(s FROM start [ FOR len]) | |
UCASE(s) | UPPER(s) | |
DATA/ORA | ||
HSQLDB | HSQLDB e Firebird | Firebird |
CURDATE() | CURRENT_DATE | |
CURTIME() | CURRENT_TIME | |
DATEDIFF(string, datetime1, datetime2)'ms'='millisecondi', 'ss'='secondi', 'mi'='minuti', 'hh'='ora', 'dd'='giorno', 'mm'='mese', 'yy' = 'anno' | DATEDIFF(string, datetime1, datetime2) millisecondi, secondi, minuti, ora, giorno, settimana, mese, anno
Solamente versioni lunghe senza '' | |
DAY(date)DAYOFMONTH(date) | EXTRACT(DAY FROM datetime) | |
DAYNAME(date) | Nessuna funzione | |
DAYOFWEEK(date) | EXTRACT(WEEKDAY FROM datetime)
Non funziona nell'interfaccia grafica delle query | |
DAYOFYEAR(date) | EXTRACT(YEARDAY FROM datetime)
Non funziona nell'interfaccia grafica delle query | |
HOUR(time) | EXTRACT(HOUR FROM datetime) | |
MINUTE(time) | EXTRACT(MINUTE FROM datetime) | |
MONTH(date) | EXTRACT(MONTH FROM datetime) | |
MONTHNAME(date) | Nessuna funzione | |
NOW() | CURRENT_TIMESTAMP | |
QUARTER(date) | CEILING(EXTRACT(MONTH FROM date)/3.00) | |
SECOND(time) | EXTRACT(SECOND FROM datetime) | |
WEEK(date) | EXTRACT(WEEK FROM datetime)
Non funziona nell'interfaccia grafica delle query | |
YEAR(date) | EXTRACT(YEAR FROM datetime) | |
TO_CHAR(datetime, string) | Nessuna funzione | |
Connessione al database | ||
HSQLDB | HSQLDB and Firebird | Firebird |
DATABASE() | RDB$GET_CONTEXT('SYSTEM', 'DB_NAME')
Non funziona nell'interfaccia grafica delle query | |
USER()
Non funziona nell'interfaccia grafica delle query |
CURRENT_USER | |
IDENTITY() | Nessuna funzione | |
Sistema | ||
HSQLDB | HSQLDB and Firebird | Firebird |
IFNULL(exp,value) | COALESCE(expr1,expr2,expr3,...) | |
CASEWHEN(exp,v1,v2) | CASE WHEN expr1 THEN v1[WHEN expr2 THEN v2] [ELSE v4] END | IIF(exp,v1,v2)(solamente quando CASE WHEN è troppo complicato) |
CONVERT(term,type) | CAST(term AS type) |
Per maggiori informazioni, come i tipi di campi in HSQLDB e Firebird vedete Documentation/FirebirdMigration.