Validating Data from Snowflake

This page covers Snowflake-to-Snowflake setup for Data validation. Use this path when both sides of the comparison are Snowflake objects, for example after copying data between databases or schemas in the same account, or after converting native tables to Iceberg. For workflow field definitions, see Data validation configuration reference.

Prerequisites

  • Orchestrator only: Snowflake-to-Snowflake cloud validation runs in-warehouse. The Orchestrator issues comparison SQL on a single Snowflake connection. You don’t need Workers or source ODBC drivers for this path.
  • Same account connection: Source and target objects must be reachable with the Orchestrator’s Snowflake connection (typically different databases or schemas in the same account). Dual-connection (cross-account) validation isn’t the in-warehouse cloud lane.
  • SELECT on both sides: The connection role needs SELECT on the source and target objects, plus the usual privileges to operate SNOWCONVERT_AI. See Required privileges.

Connectivity

You don’t add a [connections.source.*] Worker TOML section. Set SNOWFLAKE_CONNECTION_NAME (or --connection / --connection-name) to a named Snowflake CLI connection that can query both the source and target objects.

Set sourcePlatform: snowflake in the validation workflow YAML. Use three-part Snowflake names (DATABASE.SCHEMA.OBJECT) for fullyQualifiedName, and map databases or schemas when the target names differ.

Example workflow excerpt:

sourcePlatform: snowflake
targetDatabase: TARGET_DB
databaseMappings:
  SOURCE_DB: TARGET_DB
schemaMappings:
  SRC: PUBLIC
validationConfiguration:
  schemaValidation: true
  metricsValidation: true
  rowValidation: false
tables:
  - fullyQualifiedName: SOURCE_DB.SRC.CUSTOMERS
    columnNamesToPartitionBy:
      - CUSTOMER_ID
  - fullyQualifiedName: SOURCE_DB.SRC.ORDERS
    columnNamesToPartitionBy:
      - ORDER_ID
    indexColumnList:
      - ORDER_ID
    validationConfiguration:
      rowValidation: true

Validation behavior

Snowflake-to-Snowflake cloud validation uses a different compute path from other sources:

AspectOther sourcesSnowflake-to-Snowflake
ComputeWorkers extract, stage files, and load resultsThe Orchestrator runs comparison SQL inside Snowflake
WorkersRequiredNot required
Result ingestionSnowpipe (default) or COPY INTODirect writes; useSnowpipeForResults is ignored and treated as off
L3 row validationMD5 row hashes on Workers, then cell drill-downSQL multiplicity checks and MINUS set-difference in the warehouse, with SQL cell detail when index columns are present

L1 still compares INFORMATION_SCHEMA metadata. L2 still compares per-column metrics (min, max, average, and similar). Numeric comparisons honor comparisonConfiguration.tolerance.

When the unfiltered target table has zero rows, L1 still runs if enabled; L2 and L3 aren’t scheduled for that table.

Data type mappings

Source and target are both Snowflake types. Synonyms (for example INT and INTEGER) resolve to the same comparison type.

Snowflake typeSupported for validationNotes
NUMBER, DECIMAL, NUMERIC, INT, INTEGER, BIGINT, SMALLINT, TINYINT, BYTEINTYes
FLOAT, FLOAT4, FLOAT8, DOUBLE, DOUBLE PRECISION, REALYes
BOOLEANYes
VARCHAR, STRING, TEXT, CHAR, CHARACTERYes
BINARY, VARBINARYYes
DATE, DATETIME, TIME, TIMESTAMP, TIMESTAMP_NTZ, TIMESTAMP_LTZ, TIMESTAMP_TZYes
VARIANT, OBJECT, ARRAYYes
VECTORYes
GEOGRAPHY, GEOMETRYYes
INTERVALYesNative INTERVAL comparison by default. See INTERVAL data type handling.

Platform-specific considerations

  • Starting validation: Set sourcePlatform: snowflake in the workflow YAML, then submit with scai data validate create-workflow or scai data validate start. You only need a running Orchestrator; you can omit starting a Worker.