Track SchemaSmith updates across SQL Server, PostgreSQL, MySQL, and MariaDB — from SchemaTongs extraction to SchemaQuench deployments to DataTongs data sync.
Deploy to the servers you already run — SchemaSmith now targets SQL Server 2008, PostgreSQL 12, and MySQL 5.7, and adds MariaDB as a supported platform.
OPENJSON/FOR JSON) at level 130 and above and switches automatically to an XML encoding below it, where OPENJSON is a parse error; Target:CompatEncoding (auto|legacy|modern) overrides the pick.JSON_EXTRACT shred in place of JSON_TABLE. Newer DDL falls back to an equivalent path with the same end state, so a column rename uses CHANGE COLUMN instead of RENAME COLUMN; MySQL 5.6 and MariaDB 10.1 have no JSON support and are rejected.Target:UnsupportedFeaturePolicy decides what happens when a declared feature outruns the target's version, on SQL Server, PostgreSQL, MySQL, and MariaDB alike. It covers cases like NULLS NOT DISTINCT below PostgreSQL 15, CHECK constraints below MySQL 8.0.16, and descending index key parts below MySQL 8.0. The default warn applies the object without the unsupported clause and names it under "Unsupported Feature Downgrades" in the deployment summary with the version it needs; fail aborts pre-emptively instead."Platform": "MariaDb" in Product.json and packages, tokens, templates, fan-out, checkpoint/resume, and WhatIf all work as they do for MySQL. MariaDB gets its own native DDL generation, so it is a platform in its own right — a package built for MySQL does not deploy to MariaDB, or the reverse.{{ServerMajorVersion}} and {{CompatibilityLevel}}, gate a ShouldApplyExpression or a script body on version with one portable integer comparison ({{CompatibilityLevel}} >= 130) instead of each engine's native version predicate. Gate syntax on {{CompatibilityLevel}} and features on {{ServerMajorVersion}}, since a modern server can host a database left at an old compatibility level; on PostgreSQL, MySQL, and MariaDB the two resolve to the same value, so one expression shape stays portable.DataDelivery can declare "ContentEncoding": "Xml" (default "Json", unchanged), so automatic table-data delivery works at every SQL Server compatibility level, not just the 130 and above that OPENJSON shredding needs. The XML row shape is a documented, stable contract, and SchemaTongs and DataTongs take --DeliveryEncoding=Xml to extract straight into it; SQL Server only, since the other engines have no equivalent cliff.winget install SchemaSmith.SchemaSmith puts all four CLI commands on your PATH. The manifest is submitted to microsoft/winget-pkgs each release.yay -S schemasmith-bin, or any AUR helper, installs all four CLIs from the official release binaries.linux/amd64 and linux/arm64) image on Docker Hub (schemasmithyfree/schemaquench) and GHCR (ghcr.io/schema-smith/schemaquench), so a deploy runs with no .NET install. Tags are latest, X.Y.Z (immutable), X.Y, and X.SchemaSmith Deploy GitHub Action — A composite action for running SchemaQuench from a CI/CD pipeline on SQL Server, PostgreSQL, MySQL, and MariaDB, deploying on merge or previewing a run with WhatIf first. It fetches the matching self-contained binary for the runner OS at run time, and pinning @vX.Y.Z pins both the action and the CLI version it runs.OldName now renames a table or column in place on PostgreSQL, MySQL, and MariaDB, preserving its data instead of dropping and recreating the object; previously this worked on SQL Server only. The same deploy also carries the table's own primary key, unique constraint, and index renames, which PostgreSQL used to abort with 42P16: multiple primary keys for table.INFORMATION_SCHEMA once per declared object, in a form the server could not index or push filters down through; INFORMATION_SCHEMA is not a stored table on those engines, so every one of those reads was expensive.IsTemporal and re-emitted the period columns (ValidFrom and ValidTo) as ordinary columns, so extract then re-deploy silently dropped system-versioning.Control what gets dropped, see exactly what a run did, and validate every package before it ships.
PreventDrop — Set PreventDrop: true in SchemaQuench.settings.json (or the SmithySettings_PreventDrop environment variable) and that environment never drops an object for being absent from the package. Withheld drops are itemized in the run summary, and a change that requires dropping and recreating a declared object still applies normally.PreventDrop — Mark a table "PreventDrop": true and it is never dropped by absence, even after you delete it from the package. The flag persists in the database itself, as a PreventDrop extended property on SQL Server and, on PostgreSQL and MySQL, a PreventDrop column on the ProductOwnership tracking table, so it survives the table's own removal.DropCheckConstraintsRemovedFromProduct silently failed to protect a named check that referenced only one column.SchemaQuench - Summary.json and SchemaQuench - Summary.md to the log directory, capturing outcome, exit code, duration, per-target results, which migration scripts ran, bottleneck timings, and verified created, modified, and dropped counts per object type.SchemaQuench - Failures.log groups every failed scope by phase with its engine error, its resolved-SQL artifact path, and the log lines leading up to it, while a *** FAILED banner marks each one live in the progress stream.Resolved SQL written to: line, honoring ScrubArtifacts redaction like every other failure artifact.--Validate static linter — Lint a schema package with no connection, no target, and no side effects, catching malformed files, duplicate objects, dangling references, undefined tokens, and JSON-schema violations. It exits 0 when clean and 2 on any error, so it drops straight into a CI gate.<schema>.<table>[.<VariantName>].json, with the schema segment omitted on MySQL and schema-template packages, so a table's variants sort together in source control. A table's identity lives in its content, so a renamed file still deploys; --Validate just emits an SS-FILE-NAME-003 warning naming the canonical form.--Key=value, not just the ones with named switches. Nest with a double underscore (--Target__Server=prod-db) and the override beats the settings file, user secrets, and environment variables.DataDelivery can now be an array of independently gated deliveries, each with its own ShouldApplyExpression and optional VariantName. Every delivery whose gate passes applies, so you can hold seed data to dev, swap a lean production reference set for a rich one, or layer additive patch slices.IdentificationDatabase template property re-targets DatabaseIdentificationScript at a control-plane registry database instead of the platform init database. It is token-resolvable, and on PostgreSQL it is the only way to read a registry roster, since a connection there cannot cross databases.ShouldApplyExpression, SchemaTongs now evaluates each gate against the source database and folds the extracted shape into the variant that is active there, keeping its gate and variant name. Previously extraction discarded the extracted shape and silently lost real drift.enum('web','ios','android') deployed as enum('WEB','IOS','ANDROID'), because type normalization upper-cased the quoted literals along with the keyword. Only the keyword is upper-cased now, and values compare case-sensitively so a corrected declaration converges.GENERATED … AS IDENTITY column failed to deploy with a repeating syntax error and never converged; identity columns now compare by kind only. Computed columns on a new table also skip the old create-plain-then-drop-and-re-add cycle.Ship targeted patches, protect what you didn't touch, and deploy safely across engine versions.
--Zip bundling.--TestConnection and --PreviewTargets validate every configured server and print a read-only report of the databases and schemas a run would touch, exiting before any change is made.MinimumVersion enforcement — SchemaQuench detects each target's engine version and aborts the whole run before touching anything if a target is below the declared version floor (previously the field was metadata only).ShouldApplyExpression now accepts either a bare predicate or a full SELECT on every kind of gate.Multi-tenant fan-out, conditional deployments, and deployments you can debug.
{{SchemaName}} — a natural fit when each tenant owns its own schema.ShouldApplyExpression evaluated against the target at deploy time — split engine-specific folders, skip a folder on managed platforms, or keep test data out of production.One free product, three platforms, one source tree.
--ResumeQuench picks up after a failed run and skips everything that already completed. No more re-running the first 50 migrations because the 51st failedDataDelivery block on a table and SchemaSmith handles foreign-key dependency ordering and nullable FK columns automatically. Hand-authored merge scripts go awayShouldApplyExpression) — Templates carry SQL expressions evaluated at runtime. Deploy different schemas to dev, test, and prod from the same package{{TokenName}} resolves in every script (Before/After, objects, migrations, data delivery), with environment-variable overrides. Advanced tags pull values from inline queries, files, binary contents, or full schema JSON. One package parameterizes cleanly across every environmentKindleTheForge, UpdateTables, and DropTablesRemovedFromProduct toggles let you run partial-package deployments — data fixes without schema churn, or schema-only without touching reference datalibicuchoco install schemasmith on Windows. .deb and .rpm packages for Debian, Ubuntu, RHEL, Fedora, and Amazon Linux. One install puts all three CLI commands on your PATHCommunity License v2.0: No Restrictions on Organization Size or Revenue
License file integration, checkpoint-based deployment recovery, and five new SchemaHammer UI features strengthen reliability and streamline workflow management across all editions.
Includes all Community fixes above, plus:
Refined DataTongs configuration and improved PostgreSQL type handling deliver cleaner error messages and more precise data extraction for enterprise workflows.
Includes all Community changes above, plus:
Includes shared changes above, plus:
PostgreSQL Enterprise edition launches alongside table import capabilities and limited patch mode, expanding SchemaSmith's reach across database platforms.
Includes all Community changes above, plus:
Targeted fixes for data handling and delivery reliability round out the fall release cycle.
Includes all Community fixes above, plus:
Table and column rename support, expanded CLI flexibility, and streamlined installers forge a more powerful and accessible schema management experience.
--ConfigFile switch — Specify an alternate appsettings configuration file--Version switch — Display version information from the command line--LogPath switch — Specify a custom path for log file outputSCHEMASMITH_ environment variable prefix for configurationIncludes all Community changes above, plus:
Foundation release introduces DataTongs trigger controls, Docker containerization support, and core stability improvements for production-ready deployments.
Includes all Community changes above, plus: