Migracija iz HSQLDB

From The Document Foundation Wiki
Jump to: navigation, search
This page is a translated version of the page Documentation/HowTo/MigrateFromHSQLDB and the translation is 100% complete.

Other languages:
dansk • ‎Deutsch • ‎English • ‎français • ‎italiano • ‎português do Brasil • ‎slovenščina

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:

Dialogue migrate.png

Na tej točki izberite Kasneje, vse dokler ne izvedete vseh naslednjih previdnostnih ukrepov.

  1. Izdelajte varnostno kopijo datoteke zbirke podatkov HSQLDB.
  2. 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!
  3. Imena tabel in stolpcev v Firebirdu so lahko dolga največ 31 znakov. Po potrebi jih zato prilagodite.
  4. Zavoljo hrošča je potrebno v vseh tabelah polja datuma, časa in datuma/časa dopolniti s poljem, ki hrani vsebino kot besedilo.
  5. Zavoljo hrošča se slike, prebrane v HSQLDB, po migraciji v zbirkah podatkov Firebird ne prikažejo.
  6. 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.

Image change.png

Č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:

Firebird migrated odb content.png

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:

IFNULL unknown.png

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:

Unknown Error Substring.png

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.).