Snowflake
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.
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.
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.
Diff project ↔ built artifact ↔ live account in any direction. Every change lands with a per-field detail of exactly what differs.
Publish with a safety classifier that refuses data-loss changes unless you pass an explicit gate. Partial-failure rollback included.
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:
UNRECOVERABLE.DESTRUCTIVE, not unrecoverable.ALTER COLUMN can silently truncate data → gated behind allowNarrowingTypes.EXPENSIVE, flagged before you spend the credits.$ 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.
What a stream really stores, the three DDL changes that destroy it, and why Time Travel will not save you.
The gap between application CI/CD and warehouse DDL — and how state-based diffing closes it.
SDT is priced identically to its sibling. The deterministic core is free forever; Pro and Team add compare, apply-in-CI, and rollback.