Dokumentation/SådanMigrererDuFraHSQLDB

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 98% complete.

Outdated translations are marked like this.
Other languages:
dansk • ‎Deutsch • ‎English • ‎français • ‎italiano • ‎português do Brasil • ‎slovenščina

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:

Dialogue migrate.png

Dette bør Senere vælges, indtil alle de følgende forholdsregler er taget.

  1. Tag backup af HSQLDB-databasefilen.
  2. 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!
  3. Tabelnavne og kolonnenavne i Firebird kan kun være op til 31 tegn lange. Ret til om nødvendigt.
  4. På grund af en fejl skal datofelter, tidsfelter og dato-/tidsfelter i alle tabeller suppleres med et felt, der lagrer indholdet som tekst.
  5. På grund af en fejl vises billeder, der er indlæst i HSQLDB, ikke i Firebird-databasen efter migration.
  6. 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.

Image change.png

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.

Firebird migrated odb content.png

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 unknown.png

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:

Unknown Error Substring.png

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 sammenkædes med '||'. 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.