Muunnokset hallintajärjestelmästä toiseen - Raision-seudun-koulutuskuntayhtyma/Tietokannat GitHub Wiki

Alkuperäinen taulu SQLite

Tietotyypit ja muut tuotekohtaiset ominaisuudet muunnetaan esim. Visual Studio Coden editorilla. Seuraavassa koodikatkelmassa on SQLiten hallintajärjestelmästä tuotettu SQL-skrpiti taulun luonnista:

CREATE TABLE IF NOT EXISTS "tyokalu" (
	"tyokalukoodi"	INTEGER,
	"nimike"	TEXT NOT NULL,
	"merkki"	TEXT NOT NULL,
	"malli"	TEXT NOT NULL,
	"paivavuokra"	NUMERIC NOT NULL,
	PRIMARY KEY("tyokalukoodi" AUTOINCREMENT)
);

Tietotyyppien nimet on muutettu Change All Occurences-toiminnolla PostgreSQL:n tietotyypeiksi. Perusavain on määritelty suoraan luontikomentoon

CREATE TABLE  "tyokalu" (
   "tyokalukoodi"	SERIAL PRIMARY KEY,
   "nimike"	CHARACTER VARYING NOT NULL,
   "merkki"	CHARACTER VARYING NOT NULL,
   "malli"	CHARACTER VARYING NOT NULL,
   "paivavuokra"	REAL NOT NULL,
   
);

Perusavain voidaan myös määritellä erikseen rajoitteena:

CREATE TABLE  "tyokalu" (
   "tyokalukoodi"	SERIAL,
   "nimike"	CHARACTER VARYING NOT NULL,
   "merkki"	CHARACTER VARYING NOT NULL,
   "malli"	CHARACTER VARYING NOT NULL,
   "paivavuokra"	REAL NOT NULL,
        CONSTRAINT tyokalu_pk PRIMARY KEY("tyokalukoodi")

Koska tietokantaobjektien nimissä ei ole välilyöntejä, lainausmerkit voitaisiin jättää pois.

dBeaver

dBeaver mahdollistaa tietokannan taulun siirtämisen suoraan tietokannasta toiseen. Microsoft SQL Server tietokannan taulut saadaan siirrettyä perusavaimineen päivineen PostgreSQL-tietokantaan. Ongelmaksi jää kuitenkin se, ettei toiminto päivitä PostgreSQL:n sekvenssinumeroita. Sekvenssinumeroita voi päivittää käsin seuraavasti:

ALTER SEQUENCE public.asiakas_asiakasnumero_seq
	RESTART 144;

Jos tauluja on paljon tämä on melko työlästä. Edellinen komento ei kuitenkaan hyväksy arvokseen muuttujia tai alikyselyllä saatuja tietoja. Tämä käy ilmi, kun lukee dokumentaation riittävän tarkasti. Sieltä löytyy kuitenkin setval()-funktio, jolla sekvenssinumeroinnin saa korjattua. Seuraavassa esimerkissä on komento, jolla numerointi voidaan korjata, mikäli tietokannalla ei ole muita käyttäjiä.

-- Funktiolla setval(sekvenssin_nimi, viimeisin_arvo) voidaan muuttaa arvoa kuten ALTER SEQUENCE sekvenssin_nimi RESTART-komennolla,
-- mutta se hyväksyy arvokseen myös muuttujan tai alikyselyn
-- COALESCE-funktio palauttaa ensimmäisen NULL-arvosta poikkeavan parametrin: jos MAX-arvoa ei ole, eli taulu on tyhjä, annetaan arvoksi 1
SELECT setval('public.asiakas_asiakasnumero_seq', COALESCE((SELECT MAX(asiakasnumero) FROM public.asiakas),1));

Jos tietokanta on tuotantokäytössä tai sillä on useampia käyttäjiä, kannattaa samalla estää muita lisäämästä tietoja tauluun sillä aikaa, kun sekvenssinumeroita päivitetään. Esimerkki seuraavassa skriptissä:

--Aloitetaan transaktio, jotta taulu voidaan lukita (lukituksen voi määritellä vain tapahtuman sisälle), WORK-sana ei ole pakollinen
BEGIN WORK;

--Lukitaan taulu muutoksen ajaksi, jottei joku toinen pääse lisäämään tauluun jotain ja muuttamaan sekvenssinumeroa
LOCK TABLE public.asiakas IN EXCLUSIVE MODE

--Asetetaan uusia arvo sekvenssille
SELECT setval('public.asiakas_asiakasnumero_seq', COALESCE((SELECT MAX(asiakasnumero) FROM public.asiakas),1))

--Päätetään transaktio, jolloin lukitus poistuu
COMMIT WORK;