Dokumentation/SådanMigrererDuFraHSQLDB
TDF LibreOffice Document Liberation Project Community Blogs Weblate Nextcloud Redmine Ask LibreOffice Donate
LibreOffice 6.1-udgaven vil gradvis erstatte den interne HSQLDB med den interne Firebird-database. Først og fremmest bliver dette antydet af det faktum, at eksisterende Firebird-databaser ikke længere kræver aktivering af den eksperimentelle tilstand.
Hvis den eksperimentelle tilstand er aktiveret i LibreOffice, vises følgende dialog, når du får adgang til en intern HSQLDB-database:
Dette bør Senere vælges, indtil alle de følgende forholdsregler er taget.
- Tag backup af HSQLDB-databasefilen.
- Kopier visninger fra SQL-koden og gem dem som forespørgsler. Juster senere og gem som visninger igen. Visninger kan ikke redigeres i Firebird på dette tidspunkt!
- Tabelnavne og kolonnenavne i Firebird kan kun være op til 31 tegn lange. Ret til om nødvendigt.
- På grund af en fejl skal datofelter, tidsfelter og dato-/tidsfelter i alle tabeller suppleres med et felt, der lagrer indholdet som tekst.
- På grund af en fejl vises billeder, der er indlæst i HSQLDB, ikke i Firebird-databasen efter migration.
- Rene tekst-tabeller (integrerede *.csv-tabeller osv.) er ikke mulige i Firebird.
Migrer dato-felter, tids-felter og dato-/tids-felter
Migrationsguiden kan ikke håndtere korrekt migration af dato-felter, tids-felter og dato-/tids-felter. Det er fordi HSQLDB arbejder med lokale tidszoner. Under dato-/tids-migration bliver dette pludselig om sommeren til værdier, som er 2 timer tidligere, men kun en time om vinteren. Datoer bliver altid flyttet en dag frem osv. Følgende metode hjælper med at få passende værdier fra HSQLDB ind i Firebird-databasen og så oprette tids- og dato-værdier igen.
!. Tabeller, der indeholder dato-felter, tids-felter dato-/tids-felter i HSQLDB, skal hver have tilføjet et VARCHAR-felt:
"Dato_T" VARCHAR (10), "Tid_T" VARCHAR (8), "DatoTid_T" VARCHAR (19)
2. Udfør denne kommando via Funktioner → SQL:
UPDATE "Tabel" SET "Date_T" = CAST ("Dato" AS VARCHAR (10)); UPDATE "Tabel" SET "Tid_T" = CAST ("Tid" AS VARCHAR (8)); UPDATE "Tabel" SET "DatoTid_T" = LEFT (CAST ("DatoTid" AS VARCHAR (30)), 19);
3. Når alle felter også er tilgængelige som tekstfelter i tabellerne, kan migrationen fortsætte. Derefter skal den migrerede Firebird-databasefil opdateres igen:
UPDATE "Tabel" SET "Dato" = "Dato_T"; UPDATE "Tabel" SET "Tid" = "Tid_T"; UPDATE "Tabel" SET "DatoTid" = "DatoTid_T";
Efter denne handling er de tilsvarende værdier fra HSQLDB også tilgængelige i den nye Firebird-databasefil. Felterne "Dato_T", "Tid_T" og "DatoTid_T" kan så slettes.
Gør billeder fra tabeller på formularer synlige og foranderlige
Migrationsguiden opretter felter med typen Billede[BLOB] i felter, der var ansvarlige for billeder i HSQLDB (Billede[Longvarbinary]). Denne type findes i GUI, men er sandsynligvis ikke knyttet til den rigtige datatype. For at gøre disse billeder synlige igen, skal de kopieres til et felt af typen BLOB[BLOB], således at visning og ændring af billedindholdet i formularen bliver mulig. Rapporter kan på dette tidspunkt endnu ikke vise billeder fra Firebird-databasefiler.
Selv om brugeren ikke har ændret noget i et billedfelt, vises meddelelsen om, at en ændring ikke er mulig og at kolonnen i stedet kan slettes og genoprettes. Det er bedst at vælge Nej, ellers mistes de data, der opbevares i feltet.
1. Tabeller, som indeholder billeder, skal suppleres med et BLOB[BLOB]-felt: "Image_N" BLOB[BLOB]
2. Under lageringen må du ikke tillade, at datatypen på det billed-felt, der blev oprettet under importen, bliver ændret.
3. Kør denne kommando via Funktioner → SQL:
UPDATE "Tabel" SET "Billed_N" = "Billed";
4. Åben tabelredigeringen, slet den gamle "Billed"-kolonne og tillad ikke, at datatypen på det nye Billed-felt bliver ændret ved at feltet slettes.
5. Åbn tabelredigeringen, tilføj en ny "Billed"-kolonne og tillad ikke, at datatypen på et Billed-felt bliver ændret ved at feltet slettes.
6. Kør denne kommando via Funktioner → SQL:
UPDATE "Tabel" SET "Billede" = "Billede_N";
7. Åbn Tabelredigeringen, slet kolonnen "Billede_N" og tillad ikke, at det nye felts datatype bliver ændret ved at feltet slettes.
Migrationsfejl i underformularer og parameterforespørgsler
På grund af en fejl i migrationen, arbejder parameterforespørgsler og underformularer ikke korrekt. Derfor skal databasefilen desværre pakkes ud og den deri opbevarede fil content.xml skal bearbejdes. Denne fil meddeler fejlagtigt
db: parameter-name-substitution = "false"
Dette skal ændres til
db: parameter-name-substitution = "true"
eller det kan straks fjernes helt. Derefter kan content.xml læses tilbage til databasefilen.
Indhold i *.odb-filen efter migrationen
Indholdet af HSQLDB'en fjernes ikke fra *.odb-filen under migrationen.
Efter migrationen er filen "firebird.fbk" placeret i databasefilen i undermappen "database" som supplement til HSQLDBen. Denne fil indeholder de migrerede data og udpakkes i operativsystemets midlertidige mappe, når databasefilen startes.
Også de tidligere indstillinger af content.xml er bevaret. Den tilsvarende fil er bare blevet omdøbt til "content_before_migration.xml". For at kunne tilgå HSQLDBs data igen, skal den nye "content.xml" omdøbes til "content_new.xml" og filen "content_before_migration.xml" til "content.xml".
Efter en succesfuld migration kan filen "content_before_migration.xml" samt "backup", "data", "properties" og "script"-filerne, der er placeret i mappen "database", slettes. Dette anbefales naturligvis, hvis databasen allerede tidligere var temmelig omfattende. Dataene er jo blevet fordoblet under migrationen.
Tilpas funktioner i forespørgler
Mange funktioner i forespørgsler har de samme navne i HSQLDB og Firebird og virker ens. Når du åbner en forespørgsel, der tidligere har virket i HSQLDB, kan det imidlertid ske, at der vises en meddelelse som denne:
IFNULL-funktionen findes ikke i Firebird. Et blik på nedenstående liste viser at COALESCE-funktionen kan bruges i både Firebird og den interne HSQLDB. Denne funktion er endnu mere universel, fordi den kan forespørge om et vilkårlig antal værdier og det første træf, der ikke er NULL, returnerer den tilsvarende værdi. Desværre giver base-SQL-redigeringen ikke mulighed for at dele en term med Søg og erstat. I stedet kan IFNULL simpelthen erstattes af COALESCE, hvis termen forekommer flere gange i en forespørgsel. I den slags transformationer er det derfor tilrådeligt at kopiere forespørgslen til en simpel tekstbehandler med Søg og erstat-funktion og så foretage erstatningen der og overskrive det gamle indhold med den.
Det bliver mere kompliceret, når den næste meddelelse dukker op:
Fejlmeddelelsen er første omgang meningsløs. Ingen nyttige detaljer. Den vistes her første gang, funktionen SUBSTRING dukkede op i en forespørgsel. Denne funktionalitet findes også i Firebird, men Firebird tillader ikke den komma-separerede, stenografiske notation, som er mulig med HSQLDB. Du skal i stedet omskrive til SUBSTRING (s FROM start [FOR len]).
Den følgende tabel giver et overblik over funktionaliteter, der skal justeres, fordi de ikke har det samme navn i Firebird eller, i værste fald slet ikke findes. Listen slår ikke fast, at Firebird har færre funktioner end den interne HSQLDB. Der findes bare ikke en erstatning for visse funktioner.
En funktion som findes i kolonnen "HSQLDB og Firebird" kan ændres allerede før migrationen. Et eksempel på dette er kombinationen af flere strenge: CONCAT såvel som kombinationen med '+' kan allerede nu erstattes af '||'. Denne forbindelse virker i begge interne databaser. HSQLDBs senere funktion på virkes ikke af denne ændring.
En funktion, som kun findes under enten HSQLDB eller Firebird, men ikke i den midterste kolonne, kan endnu ikke erstattes. Så skulle databasen først være migreret. Koden til visninger med en af disse funktioner skal gemmes andetsteds - fx som en forespørgsel. Ændring af koden er først mulig efter migrationen.
Nogle funktionaliteter kan ikke migreres. Det vises med noten med rød gennemstregning.
Data-motorfunktioner i HSQLDB og Firebird
Første kolonne viser funktioner i HSQLDB, som ikke er tilgængelige i Firebird. Anden kolonne viser funktioner, som vil virke i HSQLDB og Firebird med samme resultat. Tredje kolonne viser funktioner i Firebird, som skal vælges i stedet for funktioner i HSQLDB. Disse funktioner giver samme resultat som funktioner i samme række under HSQLDB, men ikke er tilgængelige med dette navn på funktionen i HSQLDB.
Numeric | ||
HSQLDB | HSQLDB and 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) | No Function | |
TRUNCATE(a,b) | TRUNC(a,b) | |
TEXT | ||
HSQLDB | HSQLDB and Firebird | Firebird |
ASCII(s) | ASCII_VAL(s) | |
BIT_LENGTH(s) | Returns length of text. HSQLDB: 16bit per character Firebird: 8bit, special character 16bit. Same Name, different counting! | BIT_LENGTH(s) |
CHAR(c) | ASCII_CHAR(c) | |
CONCAT(str1,str2)
'str1'+'str2'+'str3' |
'str1'‖'str2'‖'str3' | |
DIFFERENCE(s1,s2) | No Function | |
HEXTORAW(s) | No Function | |
INSERT(s1,start,len,s2) | OVERLAY(s1 PLACING s2 FROM start [FOR len])
Not working in query-GUI | |
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) | Same Name, different counting! | |
RAWTOHEX(s) | No Function | |
REPEAT(s,count) | No Function | |
RTRIM(s) | TRIM(TRAILING FROM s) | |
SOUNDEX(s) | No Function | |
SPACE(count) | No Function | |
SUBSTR(s,start[,len])
SUBSTRING(s,start[,len]) |
SUBSTRING(s FROM start [ FOR len]) | |
UCASE(s) | UPPER(s) | |
DATE/TIME | ||
HSQLDB | HSQLDB and 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
Only long version without | |
DAY(date)DAYOFMONTH(date) | EXTRACT(DAY FROM datetime) | |
DAYNAME(date) | No Function | |
DAYOFWEEK(date) | EXTRACT(WEEKDAY FROM datetime)
Not working in query-GUI | |
DAYOFYEAR(date) | EXTRACT(YEARDAY FROM datetime)
Not working in query-GUI | |
HOUR(time) | EXTRACT(HOUR FROM datetime) | |
MINUTE(time) | EXTRACT(MINUTE FROM datetime) | |
MONTH(date) | EXTRACT(MONTH FROM datetime) | |
MONTHNAME(date) | No Function | |
NOW() | CURRENT_TIMESTAMP | |
QUARTER(date) | CEILING(EXTRACT(MONTH FROM date)/3.00) | |
SECOND(time) | EXTRACT(SECOND FROM datetime) | |
WEEK(date) | EXTRACT(WEEK FROM datetime)
Not working in query-GUI | |
YEAR(date) | EXTRACT(YEAR FROM datetime) | |
TO_CHAR(datetime, string) | No Function | |
Databaseconnection | ||
HSQLDB | HSQLDB and Firebird | Firebird |
DATABASE() | RDB$GET_CONTEXT('SYSTEM', 'DB_NAME')
Not working in query-GUI | |
USER()
Not working in query-GUI |
CURRENT_USER | |
IDENTITY() | No Function | |
System | ||
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)(only if CASE WHEN is to complicated) |
CONVERT(term,type) | CAST(term AS type) |
Find flere oplysninger bl.a. om felttyper i HSQLDB og Firebird på Documentation/FirebirdMigration.