Dokumentation/SådanMigrererDuFraHSQLDB

    From The Document Foundation Wiki
    This page is a translated version of the page Documentation/HowTo/MigrateFromHSQLDB and the translation is 100% complete.

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