Solutions · Data migration

Build migration workflows, not a turnkey migration engine.

Move records from an export into a SQL table as a workflow you can read: mapping, type checks, unique keys, batches and retries, then a reconciliation you design and a rollback someone owns.

What you automate

Three workflows teams build here first.

  1. 01

    A one-off move from a legacy system’s CSV export into a MySQL table, mapped column by column and keyed so a rerun updates rows instead of duplicating them.

  2. 02

    A repeated sync while two systems run side by side, on a schedule, until the old one is switched off.

  3. 03

    A reconciliation after each run: row counts and checksums on both sides, with a named person deciding what happens when they differ.

The workflow

What runs, step by step.

The template’s steps up to the upsert, then a worked design for the rest: counts and checksums compared on both sides, a report when they match and a named owner deciding on rollback when they do not.

  1. 01Start a migration run
  2. 02Download the export
  3. 03Parse CSV
  4. 04Map columns, check types
  5. 05Check unique keys
  6. 06Work through in batches
  7. 07Upsert by key, with retry
  8. 08Count and checksum (worked design)
  9. 09Totals match?
  10. 10Owner decides on rollback
  11. 11Report the run

Every step is a node type in the catalog. Diagram only: no data, no live run.

Before you start

  • An export of the source data as CSV at a URL the workflow can reach, with a header row.
  • A MySQL or MariaDB connection for the target table, with the table already created: SQL steps refuse DDL.
  • A written column mapping, the types each target column accepts, and the key that makes a row unique.
  • The count and checksum queries you will reconcile with, run against both the source and the target.
  • A named owner for rollback, and a backup or snapshot of the target taken before the first run.

What you get

Each run leaves a record of what was read, mapped, rejected and written, step by step, with the reconciliation results beside it and any rollback decision made by the person who owns it.

Limitations

  • This is a set of workflow steps you assemble and test, not a migration engine. Schema design, data cleansing rules and cut-over planning stay with your team.
  • The template’s upsert writes one row per call to MySQL or MariaDB. Other targets, including Postgres, are written as SQL in a query step.
  • Count and checksum reconciliation and the rollback step are a worked design: we have not yet published a demonstrated example of them.
  • OCNORA does not roll back writes. Undoing a run means your own backup, snapshot or reverse script, run by the owner who decides it.
  • A query step fails rather than return more rows than its limit, so large checks are written as aggregates (counts, checksums), not full reads.

Source: src/data/templates.json#data-csv-sync-to-sql (npm run sync:templates); evidence register C09 (OCNORA_WEBSITE_IMPROVEMENTS task WEB-044) · illustrative · checked 2026-09-28.

From the template library

Nightly CSV feed to SQL

Download a CSV export every night, parse it, normalise the columns with the Process engine and upsert into a table.

The template this solution builds on: download the export, parse it, normalise the columns, upsert keyed on email.5 nodes · about 20 min to set up
Every run, inspectable

See each step's output, and approve the risky ones.

Illustrated with a support workflow; the run view and the approval request look the same for every workflow.

Run · support-triagePAUSED FOR APPROVALNew ticketdoneClassify intentdoneApprove refundwaiting on a personReply to customerqueuedOUTPUT · CLASSIFY INTENTintent: "refund"confidence: 0.92customer: example-coAPPROVERsupport-leadAUDITevery step logged
A run paused for approval, with a step's output. Illustration with sample data.
Approval requestWAITING ON A PERSONSUPPORT-TRIAGE · HUMAN.PROMPTRefund order SAMPLE-1042?AMOUNT$84.00REASONItem arrived damagedAI INTENTrefund · confidence 0.92TIMEOUT4 h, then escalateApproveRejectdecision → audit log
The request the approver answers. Illustration with sample data.
Why OCNORA here

Built for this, not adapted to it.

Starts from a template

The Nightly CSV feed to SQL template downloads an export, parses it, normalises the columns and upserts each record. Import it and change the mapping.

Mapping and type checks in one step

The Process engine maps source columns to target fields and applies rules; a rule set to error stops the run on a bad row instead of writing it.

Unique keys, so reruns are safe

The upsert is keyed on the columns you choose. Running the same batch again updates the existing rows rather than adding copies.

Batches and retries

A For Each step works through the parsed rows, and each step has its own retries and timeout. A step that still fails is kept with its input and error.

Reconciliation you can read

Counts and checksums are ordinary SQL query steps whose results sit on the run, so the comparison is on the record. Shown here as a worked design.

A person owns the rollback

When the totals differ, an approval step asks a named owner what to do. OCNORA does not undo writes on its own.

Integrations

Apps this kind of workflow usually touches.

Each one has its own page with operations, triggers and auth.

See a workflow run on your own use case.

Book a technical demo. Bring an n8n file or pick a template, and we build it with you on the canvas while Workflow Health checks it before it ever runs.