SQL synchronisatie van tabellen met deels foutieve gegevens

Met het synchronize SQL-statement kunnen eenvoudig twee tabellen enkelzijdig of dubbelzijdig gesynchroniseerd worden qua inhoud. Zie Synchronize your Data with one Statement across multiple Applications of Synchronize Exact Online with Visma.net Financials voor meer informatie.

Met bijvoorbeeld het volgende statement wordt met insert en update de inhoud van de tabel ist bijgewerkt zodat die tenminste de inhoud van soll bevat. Er worden geen rijen verwijderd uit ist omdat er geen delete opgegeven is.

In de tabellen ist en soll is de kolom nk de unieke natuurlijke sleutel en uid de unieke technische sleutel:

synchronize ist
from        soll
with        insert
            or
            update all
            except created_by, created_at, date_created, session_created, uid
            ignore changes to modified_by, modified_at, date_modified, session_modified, created_by, created_at, date_created, session_created, uid
identified
by          nk

Voor het laden wordt - waar mogelijk - gebruik gemaakt van bulkloaders op de verschillende platofmren. Bulkloaders zijn bijvoorbeeld beschikbaar op Oracle (C-driver), PostgreSQL en SQL Server.

Bij het gebruik van bulkloaders wordt eerst de te verwerken dataset qua toevoegingen en mutaties samengesteld. De toevoegingen worden in groepen (“batches”) van bijvoorbeeld 1.000 rijen gehakt en dan ingelezen. Het aantal rijen is gelimiteerd per platform en is instelbaar via de driverattribuut bulk-insert-page-size-rows, gecombineerd met een limiet qua aantal bytes via bulk-insert-page-size-bytes.

Op de meeste platformen zal een bulkloader stoppen met laden van de gehele groep bij de eerste de beste foutmelding. Vaak zullen zelfs voorgaande rijen in de groep die reeds deels of geheel verwerkt zijn worden teruggedraaid.

Een foutmelding treedt bijvoorbeeld op indien de soll tabel deels gegevens bevat die niet geladen kunnen worden, zoals bijvoorbeeld te lange tekst voor het tekstveld. Zo’n error ziet er op bijvoorbeeld PostgreSQL als volgt uit:

itgenpsr010: Could not bulk insert rows into the table ‘database.public.ist’.
22001: value too long for type character varying(240).

Het Invantive SQL synchronize statement kan echter ook ge ïnstrueerd worden om met kleine groepen te werken en foutmeldingen per groep te combineren tot op zekere hoogte.

De groepgrootte kan aangepast worden met de batchsize clause. Door hier bijvoorbeeld voor 10 of zelfs 1 te kiezen wordt het laden significant langzamer, maar zal een groter percentage van de mutaties verwerkt worden vooraleer een foutmelding optreedt.

Met de clause continue on first ... errors kan bovendien ingesteld worden dat pas na een aantal foutmeldingen het synchronize statement vroegtijdig be ëindigd wordt.

De combinatie van deze technieken leidt tot een nieuwe synchronize statement dat een groter percentage van de gegevens zal laden ondanks fatale fouten in de data:

synchronize ist
from        soll
with        insert
            or
            update all
            except created_by, created_at, date_created, session_created, uid
            ignore changes to modified_by, modified_at, date_modified, session_modified, created_by, created_at, date_created, session_created, uid
identified
by          nk
batchsize   1
continue    on first 500 errors