Net-Base Lehti

14.06.2026

Tietokantarakenteen uudistus kasvaneessa Delphi-ohjelmistossa: turvallinen modernisointi ilman käyttökatkoja

Tietokantarakenteen muutos vakiintuneessa Delphi-ohjelmistossa ei ole niinkään "SQL-projekti" kuin puuttuminen käyttöön, rajapintoihin ja datavastuuseen. Tässä artikkelissa näytetään, miten hallitsette riskejä, teette migraatiot testattaviksi ja vakautatte IT:n ja liiketoimintaosaston arjen...

14.06.2026

Lehden aiheesta projektikäytäntöön

Artikkeliin liittyvät palvelu- ja tekniikkasivut

Yleensä tietokantauudistus kasvaneessa Delphi-ohjelmistossa ei ole pelkkä taulujen vaihto tai „uusi skeema“. Käytännössä tietokantaan liittyy usein kaikki, mitä yrityksessä pitää toimia päivittäin: tositteet, perustiedot, historialliset tiedot, rajapinnat ERP/DMS/CRM-järjestelmiin, raportit, käyttöoikeudet ja viime kädessä odotus siitä, että toiminta pysyy vakaana muutostyön aikana.

Monet Delphi-sovellukset ovat kasvaneet luotettavasti vuosien aikana. Juuri tämä on niiden vahvuus – mutta myös syy, miksi tietokantamuutokset ovat herkkiä. Asiantuntijalogiikka ei sijaitse vain koodissa, vaan myös tallennetuissa proseduurissa, triggereissä, implisiittisissä konventioissa ja tiedoissa, jotka ovat „aina olleet niin“. Jos modernisointi tehdään ilman rakennetta, riskeerataan katkoksia, epäjohdonmukaista dataa ja pitkäkestoisia virhetilanteita, jotka voivat ilmetä vasta viikkojen kuluttua.

Tämä kirjoitus kuvaa vakaan lähestymistavan IT-johtajille, ylläpitäjille ja teknisille projektivastuuhenkilöille: kuinka uudistus suunnitellaan, mitkä tekniset ohjauskaiteet toimivat, miten migraatiot saadaan testattaviksi ja miten turvallisuus, ylläpidettävyys ja rajapintakyvykkyys paranevat tuntuvasti – ilman että pitää pakottaa Big-Bang-uudelleenkäynnistystä.

Miksi tietokantauudistus Delphi-projekteissa on erityisen kriittinen

Delphi on keskisuuressa yrityksessä ja erikoistuneissa yritysympäristöissä usein prosessien lähellä toimivan liiketoimintaohjelmiston selkäranka. Monet näistä järjestelmistä on suunniteltu aikana, jolloin tietokantakutsut olivat usein tiiviisti kietoutuneet käyttöliittymiin ja asiantuntijalogiikkaan. Tästä syntyvät tyypilliset riskit:

  • Tiukasti kytkeytyneet tietokantakutsut: SQL-lauseet jakautuneina lomakkeissa, raporteissa, taustatöissä ja rajapintakomponenteissa. Skeeman muutos vaikuttaa silloin monessa paikassa samanaikaisesti.
  • Historiasta kasvaneet tietomallit: „Universal-taulut“, sarakkeiden monikäyttö, sekaiset tietotyypit, puuttuvat rajoitteet. Tiedot ovat toimivia mutta vaikeasti validoitavia.
  • Piilotetut sopimukset: Ulkoiset työkalut, Excel-exportit, kolmannen osapuolen järjestelmät tai eräajot luottavat sarakenimiin, lajitteluun tai tunnisteisiin ilman dokumentaatiota.
  • Käyttö jatkuvassa kuormituksessa: Uudistus ei tapahdu laboratoriossa. On tuotantokäyttäjiä, töitä, tuonteja, yöaikaisia prosesseja ja tiukasti ajoitettuja huoltokatkoja.

Päätelmä: tietokantauudistus on arkkitehtuuriprojekti. Se koskee datavastuuta, rajapintasopimuksia, operatiivisia prosesseja ja testattavuutta yhtä lailla.

Tavoitteet selkeästi määritellä: Mitä uudistuksen jälkeen tulee olla paremmin?

Ilman selkeää tavoitemäärittelyä uudistus muuttuu nopeasti pohjattomaksi projektiksi. Käytännössä seuraavat tavoitekategoriat ovat osoittautuneet toimiviksi ja ne kannattaa konkretisoida etukäteen:

1) Betrieb & Stabilität

Esimerkkejä: lyhyemmät ylläpitokatkot, toistettavat käyttöönotot, parempi suorituskyky ydintapahtumissa, vähemmän deadlock-tilanteita, ennakoitavat varmuuskopiointi-/palautusajat, selkeä peruutusmahdollisuus.

2) Wartbarkeit & Weiterentwicklung

Esimerkkejä: tietokannan versionhallinta, jäljitettävät migraatiot, vähemmän poikkeustapauksia tietokantakutsuissa, selkeät entiteetit, parempi testikattavuus tietotasolla.

3) Sicherheit & Compliance

Esimerkkejä: selkeät oikeudet (vähimmän oikeuden periaate), auditointiloki (muutosten jäljitettävyys), salaus levossa ja siirrossa, vuokralaisten erottelu, kontrolloidut ylläpitäjäkäytöt.

4) Integration & Schnittstellenfähigkeit

Esimerkkejä: vakaat API-rajapinnat, selkeästi määritelty tietojen omistajuus, raportoinnin ja operatiivisen tietokannan eriyttäminen, luotettavat tuonti-/vientiprosessit.

Nämä tavoitteet vaikuttavat arkkitehtuuripäätöksiin: tarvitseeko esimerkiksi siirtymävaihe rinnakkaiskäytöllä, onko „Zero-Downtime“ realistinen vai hyödynnetäänkö suunniteltua ylläpitokatkoa.

Tietokannan muutostyö kehittyneessä Delphi-ohjelmistossa: tyypilliset laukaisijat

Olemassa olevissa ympäristöissä näemme usein toistuvia laukaisijoita, jotka pakottavat muutokseen tai tekevät siitä vähintään taloudellisesti perustellun:

  • BDE-korvaaminen: Borland Database Engine on käytännössä riskialtis (ajurit, 32-bittiriippuvuudet, käyttöönotto). Nykyaikaiset ympäristöt suosivat ennemmin BDE-korvaamista natiivilla liitännällä (Delphi-datan käyttökerros) ja natiivilla tietokanta-ajurilla.
  • Tietokantajärjestelmän vaihto: esim. Firebirdistä tai InterBasesta PostgreSQL:ään tai SQL Serveriin, usein ajettuna käyttöperiaatteilla, HA-/varmuuskopiointistrategioilla tai standardisoinnilla.
  • Skaalausongelmat: datamäärän, käyttäjämäärän tai eräprosessoinnin kasvu asettaa indeksoinnin, lukitukset ja kyselysuunnitelmat rajoilleen.
  • Monen vuokralaisen tuki tai käyttöoikeusmalli: Myöhemmät vaatimukset osuvat malliin, joka alun perin oli „yksi vuokralainen, yksi toimipaikka“.
  • Rajapintaprojektit: Asiakasportaali, uudet REST-palvelut tai ERP-integraatiot tarvitsevat selkeät, vakaat tietosopimukset.

Tärkeää on olla sekoittamatta laukaisijaa ratkaisuun. „Siirrymme PostgreSQL:ään“ ei ole tavoite vaan keino. Tavoitteena voi olla esimerkiksi parempi operointi, selkeämmät oikeudet tai hallittu laajennettavuus.

Nykytilan kartoitus: Ilman tietojen inventaariota ei ole luotettavaa suunnitelmaa

Luotettava suunnittelu alkaa asiallisella inventaariolla. Sen ei tarvitse kestää kuukausia, mutta sen pitää tuoda esiin kriittiset riippuvuudet:

Tekninen analyysi

  • Skeeman kartta: taulut, näkymät, proseduurit, triggerit, indeksit, rajoitteet, sekvenssit/Identity-mekanismit.
  • Pääsyreitit: Missä SQL:ää suoritetaan? UI, palvelut, taustatyöt, raporttigeneraattorit, rajapinnat, tuontityökalut.
  • Transaktiorajat: Mitkä prosessit tarvitsevat oikeita ACID-transaktioita (atominen, konsistentti, eristetty, pysyvä)? Missä osapäivityksiä hyväksytään?
  • Suorituskyvyn pullonkaulat: kärkikyselyt, lukitusodotusajat, pitkät transaktiot, yöajot, suuret taulut.

Toiminnallinen analyysi

  • Tietojen omistajuus: Mikä järjestelmä on johtava lähde mille tiedoille? Mitä tulee ERP:stä, mitä ylläpidetään paikallisesti?
  • Historia ja säilytys: Mitkä tiedot on säilytettävä tarkastusvarmoina? Mitkä voidaan siivota/arkistoida?
  • Kriittiset prosessit: kuukausittainen sulku, lähetys, laskutuskierrot, tuotanto/BDE, sertifikaatti- tai tarkastustodisteet.

Juuri kehittyneessä Delphi-ohjelmistossa toiminnallinen tietojen omistajuus on usein implisiittinen. Jos sitä ei selkeytä, rakennetaan nopeasti „kauniimpia tauluja“ ja siirretään ongelmat vain rajapintoihin ja operointiin.

Tavoitearkkitehtuuri tietojen käyttöön: eriyttäminen ilman kaikkea uudelleenkirjoittamista

Suurin vipu riskin vähentämiseksi on kontrolloitu datan käyttö. Kyse ei ole niinkään ohjelmointikielestä, vaan selkeästä kerroslogiikasta (usein kutsutaan „Layer“-arkkitehtuuriksi): UI/Client, liiketoimintalogiikka, tietojen käyttö. Mitä paremmin nämä kerrokset on erotettu, sitä pienemmäksi muuttuu vaikutusalue skeeman uudelleenjärjestelyissä.

Delphi-ympäristöissä konsolidointi on usein järkevää: pois hajautetuista „ad-hoc“-SQL-kyselyistä ja kohti keskitettyjä datan käyttökohtia. BDE-Ablosung mit nativer Anbindung voi auttaa tässä, koska se mallintaa ajureita, parametrien sidontaa, transaktioita ja poolingia rakenteellisemmin. Ratkaisevaa ei ole työkalu, vaan sääntö: Schemamuutoksia ei saa joutua päivittämään 200 paikkaan käyttöliittymässä.

Pragmaattinen välivaihe: tietokantafasadi

Jos suurta refaktoroitavaa ei voi tehdä kerralla, tietokantafasadi voi auttaa: View’t tai synonyymit, jotka väliaikaisesti esittävät vanhoja sarakenimiä/rakenteita samalla kun sisäisesti uusi malli rakentuu. Tämä ei ole pysyvä tila, mutta vakiintunut keino ottaa migraatiot käyttöön iteratiivisesti.

Skeeman refaktorointi: mitkä muutokset kannattaa – ja mitkä ovat riskialttiita

Kaikki muutokset eivät ole samanarvoisia. Jotkut parantavat vakautta ja datalaatua nopeasti, toiset aiheuttavat suuria sivuvaikutuksia.

„Matalan riskin“ parannukset, joilla suuri vaikutus

  • Lisää rajoitteita: NOT NULL, viiteavaimet, yksilölliset indeksit. Ne paljastavat virheitä aikaisemmin ja estävät „hiljaisia“ epäjohdonmukaisuuksia.
  • Tietotyyppien konsolidointi: esim. selkeä erottelu päivämäärä/aika, numeeriset summat, tunnisteet. Erityisen tärkeää integraatioissa ja raportoinnissa.
  • Indeksointi käytön mukaan: indeksit todellisten suodatus- ja liitospolkujen mukaisesti, ei vatsantunnun perusteella.
  • Audit-kenttien käyttöönotto: tallentaa „kuka/mikä/milloin“ (esim. ChangedAt, ChangedBy). Tämä on käytön ja virheanalyysin kannalta erittäin hyödyllistä.

Muutokset, joilla korkea riski (suunnittele tarkasti)

  • Ensisijaisavaimen/ID-strategian muuttaminen: esim. siirtyminen yhdistetyistä avaimista surrogaattiavaimiin tai päinvastoin. Tämä vaikuttaa syvällisesti logiikkaan, tuontiin/vientiin ja viitteisiin.
  • Laajojen alueiden normalisointi: toiminnallisesti usein perusteltua, mutta yleensä vaatii massiivisia muutoksia näkymiin, raportteihin ja rajapintoihin.
  • Monivuokralaismuutokset: vuokralaiskentät, rivitason suojaus (Row-Level-Security), tietojen partitiointi – tähän tarvitaan selkeä käyttöoikeuskonsepti ja testitapaukset.

Toimiva käytäntö on erottaa uudistus „turva- ja käyttöperustaan“ (rajoitteet, auditointi, versionhallinta, käyttöoikeudet) ja „toimintamallin optimointiin“. Näin saadaan nopeasti mitattavissa oleva hyöty ilman, että jokainen prosessi tarvitsee välittömästi muutoksia.

Migraatiostrategia: Big Bang, rinnakkainen käyttö vai vaiheistus?

Strategian valinta ratkaisee riskin, aikataulun ja käyttökonseptin. Yrityksissä on kolme yleistä mallia:

1) Suunniteltu huoltokatko (klassinen cutover-migraatio)

Sovellus jäädytetään, siirretään data ja skeema, validoidaan ja otetaan käyttöön. Etu: selkeä katko. Haitta: käyttökatko ja suuri paine cutoverin aikana.

2) Rinnakkainen käyttö synkronoinnilla

Vanha ja uusi tietokanta toimivat ajoittain rinnakkain. Muutokset replikoidaan tai siirretään synkronointilogiikan kautta. Etu: vähemmän käyttökatkoa. Haitta: monimutkaiset konfliktit ja korkeammat vaatimukset valvonnalle sekä datanhallinnalle.

3) Vaiheittainen migraatio alueittain

Siirrätte toiminnalliset alueet peräkkäin (esim. perusrekisterit ensin, sitten tositteet, sitten historia). Etu: hallittavissa, hyvin testattavissa. Haitta: siirtymätilanteet vaativat selkeät säännöt ja joskus väliaikaisia adaptereita.

“Zero-Downtime” on mahdollista, mutta harvoin ilmaista. Usein lyhyt, hyvin valmisteltu huoltokatko on taloudellisesti järkevämpi kuin kuukausia kestävä rinnakkainen synkronointi.

Testattavuuden varmistaminen: Migraatioiden on oltava toistettavia ja tarkistettavia

Tietokantamuutos ei yleensä epäonnistu SQL-osaamisen puutteeseen vaan riittämättömään tarkistettavuuteen. Kaksi periaatetta ovat keskeisiä:

Migraatiot versionointina, ei käsityönä

Sen sijaan, että muutokset tehtäisiin pyynnöstä ad hoc -tyylillä, skeemamuutokset tulisi toimittaa versionoituna migraationa: yksiselitteisesti numeroituna, riippuvuudet dokumentoituina ja identtisesti suoritettavissa Test/Stage/Prod-ympäristöissä. Se helpottaa auditointeja, rollbackeja ja tiimityötä.

Validointi toimialakohtaisilla tarkistuksilla

Tekniset tarkistukset (rivimäärät, vierasavaimen eheys) eivät riitä. Tarvitaan toimialakohtaisia plausibiliteetteja: summat tositteista, avoimet saamiset/velat, varastotasot, tilaketjut. Nämä tarkistukset tulisi automatisoida, vähintään toistettavina raporteina/kyselyinä.

Käytännössä on hyödyllinen „Migration-Runbook“: tarkistuslista kullekin cutover-vaiheelle, jossa on aikataulut, vastuuhenkilöt, tarkistuskyselyt, keskeytyskriteerit ja takaisinpalautussuunnitelma.

Ylläpito & hallinta: varmuuskopiointi, palautus ja monitorointi osana projektia

Muutos ei koske vain tauluja, vaan myös operatiivisia rutiineja. Siksi ylläpito on otettava mukaan ajoissa:

  • Varmuuskopiointi/palautus-strategia: täysi varmuuskopio, inkrementaalinen, ajankohtaan perustuva palautus (Point-in-Time-Recovery). Palautustestit ovat tärkeämpiä kuin varmuuskopioiden luominen.
  • Monitorointi: tietokannan metriikat (lukot, hitaat kyselyt, CPU/IO), jobien ajankestot, rajapintojen virhetasot. Ilman lähtötasoa „parempi“ ei ole mitattavissa.
  • Huoltoikkunat ja indeksien ylläpito: Rebuild/REINDEX, tilastopäivitykset, Vacuum/Autovacuum (PostgreSQL). Tämän on sovittava datamäärään.
  • Oikeus- ja roolimalli: erottelu sovelluskäyttäjien, palvelutilien ja ylläpitäjien välillä. Ei „kaikkivaltaisia“ tilejä sovelluksissa.

Erityisesti jos tulette historiallisesti „väljästä“ ympäristöstä, oikeuskonsepti on usein ahaa-elämys: monet sovellukset toimivat liian laajoilla oikeuksilla, koska se oli aiemmin pragmaattista. Muutoksen yhteydessä on mahdollisuus korjata se kunnolla.

Rajapinnat huomioitava: tietokanta on harvoin ainoa järjestelmä

Kasvaneessa yritysohjelmistossa rajapinnat ovat usein aliarvioitu osa. Tietokantamuutos muuttaa implisiittisesti datakontrakteja: ID:t, tietotyypit, tilalogiikka, kirjausten aikapisteet.

Jos asiakasportaali, DMS tai ERP hakee dataa, on selvää, käyttääkö se suoraa tietokantayhteyttä (vältettävä) vai määriteltyjä rajapintoja (API, tiedostot, ETL). API tarkoittaa „Application Programming Interface“; tuotannossa se on relevantti vakaana sopimuksena: syötteet, tulosteet, virhetapaukset, versionhallinta.

Für Delphi-ympäristöissä askel kohti palvelukerrosta on usein perusteltu: ei siksi, että „Microservices“ kuulostavat moderneilta, vaan koska se keskittää datakutsut ja validoinnin. Tämä pienentää hyökkäyspintaa tulevien datamuutosten yhteydessä.

Hyödyllinen sisäinen linkkikonteksti voisi olla esimerkiksi artikkeli vahvojen integraatioiden ja datavirtojen rakentamisesta tai Delphi-modernisoinnista ilman toimialalogiikan menetystä – molemmat palvelevat samaa hakutarkoitusta.

Datan laatu ja puhdistus: vaikein osa on usein vanha aineisto

Monet järjestelmät toimivat, vaikka tiedot eivät ole puhtaita: päällekkäiset perustietueet, virheelliset viitteet, „keräilytilit“, vapaat tekstit koodien sijaan. Uusi skeema paljastaa nämä ongelmat – ja se on hyvä, kunhan otatte sen huomioon suunnittelussa.

Hyväksi todetut käytännöt

  • Profilointi ennen migraatiota: Mitä arvoja esiintyy todellisuudessa? Mitkä kentät ovat käytännössä tyhjiä? Missä ovat poikkeavat arvot?
  • Sääntöjen määrittäminen: Mitä sallitaan jatkossa? Mitä korjataan automaattisesti? Mitä pitää puhdistaa manuaalisesti?
  • Arkistointikonsepti: Kaikkea ei tarvitse säilyttää operatiivisessa tietokannassa. Historiat voidaan siirtää erillisiin rakenteisiin, kunhan raportointi ja auditoinnit toimivat edelleen.

Tärkeää: tietojen puhdistus on liiketoiminnallinen prosessi. IT voi toteuttaa säännöt teknisesti, mutta päätös siitä, mitkä korjaukset ovat sallittuja, on liiketoiminnan vastuulla.

Suorituskyky muutoksen jälkeen: ei pelkästään nopeampi, vaan ennustettavampi

Yleinen tavoite on „suorituskyvyn parantaminen“. Käytännössä „ennustettavuus“ on vielä tärkeämpää: vakaat suoritusajat, ei äkillisiä poikkeamia, ei deadlockeja kuukausipäätöksessä.

Tekniset toimenpiteet, jotka ovat osoittautuneet toimiviksi:

  • Lyhyet transaktiot: Käyttöliittymätoiminnot eivät saa pitää transaktioita avoinna minuuttikausia, erityisesti monikäyttäjäympäristössä.
  • Kohdennetut indeksit: Perustuvat todellisiin kyselyihin, ja niiden vaikutusta seurataan käyttöönoton jälkeen.
  • Operatiivisen ja raportoinnin erottelu: Raportointikuorma voi häiritä operatiivisia prosesseja. Read-replicat, ETL-putket tai erilliset raportointitaulut ovat tyypillisiä vastakeinoja.
  • Suunniteltavat eräajot: Ajot selkeillä suoritusaikoilla, lokitus, uudelleenkäynnistys ja hälytykset.

Uudistus on onnistunut, kun eivät vain yksittäiset kyselyt ole nopeampia, vaan kun tuotannossa on vähemmän „yllätyksiä“.

Riskien- ja rollback-suunnitelma: hätäpoistumistie on oltava rakennettuna ennen aloitusta

Rollback ei ole pessimismiä, vaan ammatillista riskienhallintaa. Kestävä suunnitelma vastaa seuraaviin kysymyksiin:

  • Milloin keskeytetään? Selkeät keskeytyskriteerit (esim. validointitarkistukset epäonnistuvat, suoritusaika ylittää raja-arvon).
  • Mihin palataan? Vanhan tietokannan snapshot/varmuuskopio, määritelty sovellusversio, konfiguraation tila.
  • Miten kommunikoidaan? Kuka informoi liiketoimintayksikköä, kuka tekee päätökset, kuka dokumentoi?

Erityisesti rinnakkaisajossa tai vaiheittaisessa migraatiossa rollback on usein ennemminkin „rollforward“: korjaatte ja jatkatte migraatiota. Myös tähän tarvitaan suunnitelma, jotta häiriöstä ei tule pysyvää ongelmaa.

Projektiorganisaatio: roolit, vastuut, päätöspisteet

Tietokantamuutoksen onnistuminen edellyttää selkeitä vastuita:

  • Tekninen johtajuus (arkkitehtuuri): Tavoitekuva, ohjausraamit, migraatioiden katselmointi.
  • DBA/ylläpito: Käyttökonsepti, varmuuskopiointi/palautus, seuranta, suorituskyvyn perustaso.
  • Asiantuntijavastuu tiedoista: Säännöt datalaadulle, asiantuntijatarkistuksen hyväksyntä.
  • Release-hallinta: Testiympäristöt, staging, cutover-runbook, muutosviestintä.

Hyvin toimineita ovat „päätösportit“: inventaarion jälkeen, prototyyppimigraation jälkeen, suorituskykytestien jälkeen, ennen cutoveria. Näin projekti pysyy ohjattavana, vaikka matkan varrella ilmenee uusia havaintoja.

Johtopäätös: modernisointi kurinalaisuudella, ei riskinottoa impulsiivisten toimenpiteiden kautta

Tietokantarakenteen uudistus kasvaneen Delphi-ohjelmiston yhteydessä on toteutettavissa, jos sen suunnittelee arkkitehtuuri- ja käyttö- ja ylläpitoprojektina: selkeällä nykytilan kartoituksella, täsmällisillä tavoitteilla, versionoiduilla migraatioilla, luotettavalla validoinnilla ja realistisella cutover- ja rollback-konseptilla. Tekninen hyöty on usein suurempi kuin „vain“ uusi skeema: parempi tietojen laatu, vakaammat rajapinnat, hallittavampi operointi ja perusta, jonka päälle modernisointitoimet (esim. palvelut, portaalit, uudet clientit) muuttuvat selvästi vähemmän riskialttiiksi.

Jos haluat valmistella uudistusta järjestelmällisesti – BDE-korvaaminen FireDAC-siirtymästä PostgreSQL- tai SQL Server -migraatioon – keskustele kanssamme lähestymistavasta, riskeistä ja realistisesta migraatiopolusta:

Ammattikontekstissa myös Delphi Modernisointi ja tietomigraatio ovat keskeisiä, kun integraatioiden, tietovirtojen ja jatkokehityksen on toimittava saumattomasti yhdessä.

Keskustele projektista tai modernisointihankkeesta Net-Base kanssa.

Seuraava vaihe

Kun aiheesta tulee todellinen projekti, arkkitehtuuri, nykyinen järjestelmäkanta ja käyttö tulisi varhaisessa vaiheessa tarkastella yhdessä.

Emme tue pelkästään yksittäiskysymyksissä, vaan myös silloin, kun lähdekoodipalasista, legacy-aiheista tai portaali-ideoista halutaan muodostaa luotettava yrityshanke.

  • Nykytila, tavoitetila ja tekniset riskit arvioidaan yhdessä.
  • REST, datan käyttö, portaalit ja käyttöönotto eivät jätetä myöhempien seurausten varaan.
  • Näette ajoissa, mikä ratkaisu on taloudellisesti ja toiminnallisesti kestävä.

Jaa artikkeli

Jaa tämä viesti suoraan

LinkedIn, X, XING, Facebook, WhatsApp ja sähköposti ovat heti käytettävissä. Instagramia varten valmistelemme linkin ja lyhyen tekstin.

Sähköposti

Instagram avautuu uuteen välilehteen. Linkki ja lyhyt teksti kopioidaan ensin leikepöydälle.