Snowflake

Snowflake schema management, done safely

Treat your Snowflake schema as code. Extract, compare, and deploy DDL with a per-change safety classifier — data-loss operations refuse by default, and rollback is a clone away.

Free tier works forever, offline. No account needed to extract, validate, or generate migration scripts.

Why migration chains rot on Snowflake

Migration-based tools (Flyway, Liquibase, schemachange) ask you to hand-write versioned files and apply them in order. That is the right model for an OLTP database whose history is the source of truth — and the wrong model for a warehouse, where the source of truth is "what should this table look like right now." Migration chains drift from reality, they are painful to reconcile when two engineers branch, and nobody can answer "what should production look like?" by reading them.

State-based schema management inverts that: you describe the desired end state as one .sql file per object, and the engine computes the diff against your live account. Your git repo is the source of truth. There is no chain to maintain.

How SDT works

1 · Extract

Pull a live Snowflake account into version-controlled .sql files via GET_DDL / SHOW — tables, views, procedures, streams, tasks, dynamic tables, and the long tail of object types.

2 · Compare

Diff project ↔ built artifact ↔ live account in any direction. Every change lands with a per-field detail of exactly what differs.

3 · Deploy safely

Publish with a safety classifier that refuses data-loss changes unless you pass an explicit gate. Partial-failure rollback included.

The safety classifier knows Snowflake

A generic diff tool calls every DROP "destructive" and leaves the judgment to whoever is reading the diff at 5pm on a Friday. SDT classifies each change into four tiers — SAFE, EXPENSIVE, DESTRUCTIVE, UNRECOVERABLE — using Snowflake-specific knowledge:

$ sdt extract --target snowflake://prod --out ./Warehouse.sdtproj
$ sdt compare --source ./Warehouse.sdtproj --target snowflake://prod

  ~ TABLE  ANALYTICS.PUBLIC.ORDERS          rebuild required     [DESTRUCTIVE]
  - STREAM ANALYTICS.PUBLIC.ORDERS_STREAM   cursor will be lost  [UNRECOVERABLE]

  1 UNRECOVERABLE change — publish refused.
  To proceed: --allowUnrecoverableDrop (drain ORDERS_STREAM first; see remediation)

Anything destructive or unrecoverable refuses to run unless you opt in explicitly — it is a structural gate, not a comment you scroll past.

Read the deep dives

Snowflake streams: the one DDL change you must never make

What a stream really stores, the three DDL changes that destroy it, and why Time Travel will not save you.

Database DevOps: why schema management is stuck in 2015

The gap between application CI/CD and warehouse DDL — and how state-based diffing closes it.

Start free

SDT is priced identically to its sibling. The deterministic core is free forever; Pro and Team add compare, apply-in-CI, and rollback.