Configuration
| Field | Required | Description |
|---|---|---|
appId | Yes | App identifier (typically "{{var.appId}}") |
tableName | Yes | Target table in app database |
sourceTable | Yes | Workflow table from a previous step |
mode | Yes | Write strategy: replaceAll, append, or upsert |
fieldMapping | Yes | Maps target database columns to source table columns. Supports generated values. |
upsertKey | Conditional | Required when mode is upsert — columns that form the unique constraint |
replaceWhere | Conditional | Required when mode is replaceAll — scopes the delete operation |
onRowError | No | "fail" (default) or "skip" |
Write modes
upsert
Insert new rows, update existing ones based onupsertKey:
upsertKey must match a unique constraint on the target table.
replaceAll
Atomically delete matching rows, then insert all source rows:replaceWhere scopes the DELETE to rows matching values from the source data.
append
Insert all rows without checking for duplicates:Validation
| Check |
|---|
appId, tableName, sourceTable, mode, fieldMapping are required |
sourceTable exists in previous steps |
fieldMapping keys exist in target schema |
upsertKey is required when mode is upsert |
replaceWhere.matchColumns exist in fieldMapping |
| Target table exists in app database |
| All required target columns are mapped |
upsertKey has a corresponding unique constraint on the target table |
| Source and target column types are compatible |
For user-triggered jobs, replaceAll mode requires replaceWhere to scope deletes |

