Migracija iz HSQLDB
TDF LibreOffice Document Liberation Project Blogi skupnosti Weblate Nextcloud Redmine Ask LibreOffice Donacija
Z izdajo LibreOffice 6.1 bo interni HSQLDB postopoma zamenjala zbirka podatkov Firebird. To nakazuje že dejstvo, da obstoječe zbirke podatkov Firebird nič več ne zahtevajo aktivacije poskusnega načina.
Če je poskusni način v LibreOffice omogočen, se pojavi naslednje pogovorno okno, ko dostopate do tabel interne zbirke podatkov HSQLDB:
Na tej točki izberite Kasneje, vse dokler ne izvedete vseh naslednjih previdnostnih ukrepov.
- Izdelajte varnostno kopijo datoteke zbirke podatkov HSQLDB.
- Kopirajte poglede iz kode SQL in jih shranite kot poizvedbe. Prilagodite jih kasneje in jih znova shranite kot poglede. Pogledov trenutno ni mogoče urejati za zbirke podatkov Firebird!
- Imena tabel in stolpcev v Firebirdu so lahko dolga največ 31 znakov. Po potrebi jih zato prilagodite.
- Zavoljo hrošča je potrebno v vseh tabelah polja datuma, časa in datuma/časa dopolniti s poljem, ki hrani vsebino kot besedilo.
- Zavoljo hrošča se slike, prebrane v HSQLDB, po migraciji v zbirkah podatkov Firebird ne prikažejo.
- Povsem besedilne tabele (integrirane tabele * .csv itn.) niso možne v Firebirdu.
Migrirajte polja datuma, časa in datuma/časa
Čarovnik za migracije ne ravna pravilno pri migraciji datumskih, časovnih in datumskih/časovnih polj. Težava je v tem, da HSQLDB deluje v krajevnih časovnih pasovih. V času migracije datuma-časa, to nenadoma spremeni v vrednosti poletnega časa, ki so dve uri prej, vendar le eno uro v zimskem času. Datume vedno predhaja en dan itn. Naslednja metoda je priročna, da pridobite ustrezne vrednosti iz HSQLDB v zbirko podatkov Firebird in nato znova ustvarite datumske in časovne vrednosti:
1. Tabelam, ki vsebujejo polja časa, datuma in časa/datuma v HSQLDB, dodajte za vsako tako polje eno polje VARCHAR:
"Datum_B" VARCHAR (10), "Cas_B" VARCHAR (8), "DatumCas_B" VARCHAR (19)
2. Zaženite naslednji ukaz prek Orodja → SQL:
UPDATE "Tabela" SET "Datum_B" = CAST ("Datum" AS VARCHAR (10)); UPDATE "Tabela" SET "Cas_B" = CAST ("Cas" AS VARCHAR (8)); UPDATE "Tabela" SET "DatumCas_B" = LEFT (CAST ("DatumCas" AS VARCHAR (30)), 19);
3. Ko so vsa polja na voljo tudi kot besedilna polja v tabelah, lahko nadaljujete z migracijo. Posledično je potrebno datoteko migrirane zbirke podatkov Firebird znova posodobiti:
UPDATE "Tabela" SET "Datum" = "Datum_B"; UPDATE "Tabela" SET "Cas" = "Cas_B"; UPDATE "Tabela" SET "DatumCas" = "DatumCas_B";
Po tem odseku so ustrezne vrednosti iz HSQLDB na voljo tudi v novi datoteki zbirke podatkov Firebird. Polja »Datum_B«, »Cas_B« in »DatumCas_B« lahko nato izbrišete.
Naredite slike iz tabel v obrazcih vidne in spremenljive
Čarovnik za migracijo ustvari polja vrste slika/image [BLOB] v tistih poljih, ki so v HSQLDB vsebovale slike (image [Longvarbinary]). Ta vrsta je prisotno v uporabniškem vmesniku, vendar ni povezana z ustrezno vrsto podatkov. Da bi bile te slike znova vidne, jih je potrebno kopirati v polje vrste BLOB [BLOB], tako da je možen prikaz in spreminjanje vsebine slike v obrazcu. Poročila trenutno ne morejo prikazati slik iz datotek zbirk podatkov Firebird.
Četudi noben uporabnik ni opravil nobene spremembe nad poljem slike, se pojavi sporočilo, da sprememba ni možna in da je mogoče namesto tega stolpec izbrisati in ponovno ustvariti. Najbolje je, da izberete Ne, sicer bodo podatki, shranjeni v poljih, izgubljeni.
1. V tabelah, ki vsebujejo slike, je potrebno dodati polje BLOB: "Slika_N" BLOB [BLOB]
2. Pri shranjevanju ni mogoče spreminjati vrste podatkov polja slike, ki je bilo ustvarjeno pri uvozu.
3. Izvedite naslednji ukaz prek Orodja → SQL:
UPDATE "Tabela" SET "Slika_N" = "Slika";
4. Odprite urejevalnik tabel, izbrišite stari stolpec »Slika« in ne dovolite, da se z brisanjem polja vrsta podatkov novega polja s slikami spremeni.
5. Odprite urejevalnik tabel, dodajte nov stolpec »Image« in ne dovolite, da se vrsta podatkov polja s slikami spremeni z brisanjem polja.
6. Zaženite naslednji ukaz prek Orodja → SQL:
UPDATE "Tabela" SET "Slika" = "Slika_N";
7. Odprite urejevalnik tabel, izbrišite stolpec »Slika_N« in ne dovolite, da se vrsta podatkov novega polja za slike spremeni z brisanjem polja.
Hrošč pri migraciji podobrazcev in poizvedb po parametrih
Zaradi hrošča v migraciji poizvedbe po parametrih in podobrazci ne delujejo pravilno. Žal je potrebno za to razpakirati datoteko zbirke podatkov in obdelati vsebovano datoteko content.xml. Ta datoteka nepravilno določa
db: parameter-name-substitution = "false"
Slednje je potrebno spremeniti v
db: parameter-name-substitution = "true"
ali pa kar takoj v celoti odstraniti. Nato lahko content.xml vstavite nazaj v datoteko zbirke podatkov.
Vsebina datoteke * .odb po migraciji
Vsebina HSQLDB med migracijo ni odstranjena iz datoteke * .odb:
Po migraciji se datoteka »firebird.fbk« nahaja v datoteki zbirke podatkov v podmapi »database« poleg HSQLDB. Ta datoteka vsebuje migrirane podatke in je razširjena v začasno mapo operacijskega sistema, ko se zažene datoteka zbirke podatkov.
Prav tako se ohranijo prejšnje nastavitve v content.xml. Ustrezna datoteka je bila ravnokar preimenovana v »content_before_migration.xml«. Da bi lahko znova dostopali do podatkov HSQLDB, je potrebno le preimenovati »content.xml« v »content_new.xm« in datoteko »content_before_migration.xml« v »content.xml«.
Po uspešni migraciji lahko datoteko »content_before_migration.xml« in datoteke »backup«, »data«, »properties« in »script«, ki se nahajajo v mapi »database« izbrišete. To je seveda še posebej priporočljivo, če je bila zbirka podatkov že poprej obsežna. Nenazadnje so bili podatki ob migraciji podvojeni.
Prilagodite funkcije v poizvedbah
Številne funkcije v poizvedbah imajo enaka imena v HSQLDB in Firebirdu in delujejo enako. Vendar se pri odpiranju poizvedbe, ki je poprej delovala v HSQLDB lahko zgodi, da se pojavi sporočilo, kot je to:
Funkcije IFNULL Firebird ne pozna. Pogled na spodnji seznam kaže, da lahko namesto tega uporabimo funkcijo COALESCE tako v Firebirdu kot v interni zbirki HSQLDB. Ta funkcija je še bolj univerzalna, saj lahko poizveduje po poljubnem številu vrednosti in prvi zadetek, ki ni NULL vrne ustrezno vrednost. Žal urejevalnik SQL programa Base ne ponuja možnosti skupne rabe izraza z Najdi in zamenjaj. Sicer bi lahko IFNULL enostavno zamenjali s COALESCE, če se ukaz pogosteje pojavlja v poizvedbi. Za take transformacije je zato priporočljivo kopirati poizvedbo v enostaven urejevalnik besedil s funkcijo najdi-in-zamenjaj, nato izvesti to zamenjavo in s tako spremenjeno vsebino prepisati staro vsebino poizbedbe.
Stvar se zaplete, ko se pojavi naslednje sporočilo:
Sporočilo o napaki je za zdaj brez pomena. Tukaj se prvič pojavi, ko se v poizvedbi prvič pojavi funkcija SUBSTRING. Ta funkcionalnost je znana tudi v Firebirdu, vendar Firebird ne omogoča z vejicami ločeno hitro notacijo, ki jo podpira HSQLDB. Namesto tega morate ponovno napisati funkcijo SUBSTRING (s FROM zacetek [FOR dolzina]).
Naslednja tabela podaja pregled, katere funkcije je potrebno prilagoditi, ker so v Firebirdu drugače poimenovane ali, v najslabšem primeru, sploh ne obstajajo. Seznam ne navaja dejstva, da ima Firebird manj funkcij kot interni HSQLDB, le dejstvo, da za določene funkcije ni nadomestnih.
Funkcije, ki se pojavijo v stolpcih HSQLDB in Firebird, lahko spremenite že pred migracijo. Primer tega je kombinacija več nizov: CONCAT kot tudi kombinacijo z '+' lahko že zamenjate z nadomestnim '||'. Ta povezava deluje v obeh internih zbirkah podatkov. Nadaljnje delovanje HSQLDB se s to spremembo ne spremeni.
Funkcije, ki se pojavlja pod HSQLDB ali Firebird, ne pa v srednjem stolpcu, še ni mogoče nadomestiti oz. zamenjati. V tem primeru je potrebno najprej migrirati zbirko podatkov. Koda pogledov z eno teh funkcij je potrebno shraniti drugod – npr. kot poizvedbo. Sprememba kode je možna šele po migraciji.
Nekaterih funkcionalnosti ni mogoče migrirati. To nakazujejo rdeče prečrtane opombe.
Funkcije podatkovnega pogona v HSQLDB in Firebirdu
Prvi stolpec prikazuje funkcije v HSQLDB, ki niso na voljo v Firebirdu. Drugi stolpec prikazuje funkcije, ki delujejo v HSQLDB in Firebirdu in vrnejo enake rezultate. Tretji stolpec prikazuje funkcije v Firebirdu, ki jih je treba izbrati namesto funkcij v HSQLDB (nadomestne funkcije). Te funkcije vrnejo enake rezultate kot funkcije v isti vrstici v HSQLDB, vendar niso na voljo pod enakim imenom funkcije v HSQLDB.
Številske | ||
HSQLDB | HSQLDB in 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) | <value for radians>*360/(2*PI()) | |
LOG(d) | LN(d) | |
RADIANS(d) | <value for degrees>*2*PI()/360 | |
ROUNDMAGIC(d) | Ni funkcije | |
TRUNCATE(a,b) | TRUNC(a,b) | |
Besedilne | ||
HSQLDB | HSQLDB in Firebird | Firebird |
ASCII(s) | ASCII_VAL(s) | |
BIT_LENGTH(s) | Vrne dolžino besedila. HSQLDB: 16 bitov na znak Firebird: 8 bitov, posebni znaki 16 bitov. Isto ime, drugačno štetje! | BIT_LENGTH(s) |
CHAR(c) | ASCII_CHAR(c) | |
CONCAT(str1,str2)
'str1'+'str2'+'str3' |
'str1'‖'str2'‖'str3' | |
DIFFERENCE(s1,s2) | Ni funkcije | |
HEXTORAW(s) | Ni funkcije | |
INSERT(s1,start,len,s2) | OVERLAY(s1 PLACING s2 FROM start [FOR len])
Ne deluje v up. vmesniku za poizvedbe | |
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) | Isto ime, drugačno štetje! | |
RAWTOHEX(s) | Ni funkcije | |
REPEAT(s,count) | Ni funkcije | |
RTRIM(s) | TRIM(TRAILING FROM s) | |
SOUNDEX(s) | Ni funkcije | |
SPACE(count) | Ni funkcije | |
SUBSTR(s,start[,len])
SUBSTRING(s,start[,len]) |
SUBSTRING(s FROM start [ FOR len]) | |
UCASE(s) | UPPER(s) | |
Datum/čas | ||
HSQLDB | HSQLDB in Firebird | Firebird |
CURDATE() | CURRENT_DATE | |
CURTIME() | CURRENT_TIME | |
DATEDIFF(string, datetime1, datetime2)'ms'='millisecond', 'ss'='second', 'mi'='minute', 'hh'='hour', 'dd'='day', 'mm'='month', 'yy' = 'year' | DATEDIFF(string, datetime1, datetime2) millisecond, second, minute, hour, day, week, month, year
Le dolga različica brez | |
DAY(date)DAYOFMONTH(date) | EXTRACT(DAY FROM datetime) | |
DAYNAME(date) | Ni funkcije | |
DAYOFWEEK(date) | EXTRACT(WEEKDAY FROM datetime)
Ne deluje v up. vmesniku za poizvedbe | |
DAYOFYEAR(date) | EXTRACT(YEARDAY FROM datetime)
Ne deluje v up. vmesniku za poizvedbe | |
HOUR(time) | EXTRACT(HOUR FROM datetime) | |
MINUTE(time) | EXTRACT(MINUTE FROM datetime) | |
MONTH(date) | EXTRACT(MONTH FROM datetime) | |
MONTHNAME(date) | Ni funkcije | |
NOW() | CURRENT_TIMESTAMP | |
QUARTER(date) | CEILING(EXTRACT(MONTH FROM date)/3.00) | |
SECOND(time) | EXTRACT(SECOND FROM datetime) | |
WEEK(date) | EXTRACT(WEEK FROM datetime)
Ne deluje v up. vmesniku za poizvedbe | |
YEAR(date) | EXTRACT(YEAR FROM datetime) | |
TO_CHAR(datetime, string) | Ni funkcije | |
Povezovanje z zbirko podatkov | ||
HSQLDB | HSQLDB in Firebird | Firebird |
DATABASE() | RDB$GET_CONTEXT('SYSTEM', 'DB_NAME')
Ne deluje v up. vmesniku za poizvedbe | |
USER()
Ne deluje v up. vmesniku za poizvedbe |
CURRENT_USER | |
IDENTITY() | Ni funkcije | |
Sistem | ||
HSQLDB | HSQLDB in 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)(samo ko je CASE WHEN preveč zapleten) |
CONVERT(term,type) | CAST(term AS type) |
Podrobnosti o vrsti polj v HSQLDB in Firebirdu lahko najdete tukaj: Documentation/FirebirdMigration (v angl.).