- Concept
- Release notes
6.0.0 Secure Release Notes
What's new
Liquibase Secure is the standard for Database Change Governance. For years, every Liquibase run ended in a terminal, with evidence scattered across pipeline logs, tickets, and screenshots. Liquibase Secure 6.0 extends that standard from the pipeline to the entire organization.
The Liquibase Secure CLI you already run on every workstation and CI/CD agent is now joined by Liquibase Secure Server, a self-hosted web application deployed inside your own network. Together, they turn every update, rollback, policy check, and drift scan into a shared, governed record that your entire organization can see, filter, and act on.
This is a major release, but it is a continuation, not a restart. Everything the command line did in Liquibase Secure 5.x it still does in 6.0, and existing changelogs, flow files, checks settings, and pipelines keep working. What 6.0 adds is a platform around that engine: Change Intelligence for visibility, Change Governance for centrally managed policy, a substantially upgraded Change Automation engine with cloud-native database connectivity, Developer Productivity tooling that brings Liquibase into the IDE and into AI coding assistants, and a role-based access control model built for regulated environments.
Liquibase Secure 6.0.0 is available now. Download Liquibase Secure 6.0.0 and see the Liquibase Secure product page Liquibase Secure for an overview of the platform.
Note: Liquibase Secure is a distinct commercial product with its own distribution and license, not Liquibase Community with a key applied. Standardize on one distribution per environment.
What's new at a glance
Liquibase Secure is now delivered as a platform of complementary components. Two run-time pieces, the Liquibase Secure CLI and Liquibase Secure Server, host the capabilities below. Each component is described in its own section of these release notes and in a dedicated Technical Overview.
Component | What it does | Where it runs | Learn more |
Change Intelligence | Dashboards, DORA metrics, operation history, policy check results, drift findings, and optional, bring-your-own-model AI analysis across every pipeline and environment. | Liquibase Secure Server (module) | |
Change Governance | A central, searchable library of policy catalogs, packages, and checks, mapped to your pipelines, connections, and changelogs through Assignments. | Liquibase Secure Server (module) | |
Change Automation | The command-line engine that previews, checks, deploys, tracks, rolls back, and reports database change. Includes Database Connectors to 65+ database platforms and cloud identity and secrets services. | Liquibase Secure CLI | |
Developer Productivity | Liquibase Secure Developer for VS Code and the Liquibase AI Changelog Generator (MCP server): changelog authoring, local operations, and AI-assisted, API-generated changesets. | Developer workstation / CI agent | |
Deployment Connectors | Governed database change inside ServiceNow, GitHub, and Terraform workflows. | Future release | |
Security: SSO and RBAC | Microsoft Entra single sign-on, scoped API tokens, persona-based permission templates, groups, overlays, grants and denies, and an immutable audit log. | Liquibase Secure Server (Core) |
Continuity from Liquibase Secure 5.x
Liquibase Secure 6.0 builds directly on the 5.x generation. The command-line tool your pipelines already run is unchanged in form and is now called Change Automation (in 5.x it was named Secure Automation, and 5.x license keys and support artifacts refer to it as general Liquibase Secure). It runs inside the Liquibase Secure CLI with a substantially expanded capability set in 6.0, described under Change Automation below. Liquibase Secure Server is additive: a CLI that is not connected to a server operates entirely from local configuration and writes its outputs locally, exactly as before. Connecting it adds visibility and centralized governance without changing how a deployment executes.
Most of 6.0 needs nothing from you when you upgrade. A small number of changes do require action and are listed in Action required when you upgrade. For step-by-step guidance, see Upgrading to Liquibase Secure 6.0.
The Liquibase Secure platform
Liquibase Secure is delivered as two components. Both run entirely inside your trust boundary, and neither depends on Liquibase-managed infrastructure.
Liquibase Secure CLI
The Liquibase Secure CLI installs on developer workstations and CI/CD agents and implements Change Automation: it reads changelogs, previews SQL, runs policy checks, applies and rolls back change, detects drift, and writes reports and structured logs. It makes outbound connections only and holds no credentials beyond the moment of execution.
New in 6.0, the CLI integrates with Liquibase Secure Server through paths that are always initiated by the CLI over HTTPS; the server never calls in. The Change Intelligence extension is bundled in the distribution and disabled by default; set LIQUIBASE_PLATFORM_ENABLED=true and the connection settings, and the commands that change or inspect a database (the update and rollback command families, excluding their -sql preview variants, plus checks run, diff, and diff-changelog) report their operation metadata to the server. The checks commands can resolve their configuration from a Change Governance Assignment instead of a local Checks Settings File. Reporting is non-blocking: if the server is unreachable, your Liquibase command still completes successfully; the trade-off is that the operation is not recorded in the dashboard.
Liquibase Secure Server
Liquibase Secure Server is the self-hosted, containerized service you deploy inside your own network to get the Liquibase Secure 6.0 web interface. It receives operation data from every machine that runs Liquibase, stores it, and serves the dashboards and governance interfaces your team uses. It never connects to a managed database and holds no database credentials; everything it knows arrives from your own CLI instances or from authenticated users in the browser.
The server hosts three functional areas behind one API and one web application: Core services (accounts, workspaces, projects, connections, changelogs, pipelines, license management, RBAC, SSO, API tokens, and the audit log), present in every installation; Change Intelligence, the licensed visibility module; and Change Governance, the licensed policy module. The modules share the API and web tiers, the data stores, authentication, and the access control model, so administering access to either uses the same groups, templates, and audit log as everything else.
Your operation data stays inside your network and is never sent to a dashboard hosted by Liquibase. The server keeps operations, changelogs, connections, users, and workspaces in one PostgreSQL database, and isolates your encrypted database connection credentials and SSO secrets in a second one, so a compromise of the first does not expose them. Deploy it on-premises, on a private cloud VM in a private subnet, or on a VPN-protected host; Liquibase Secure Server is distributed as container images. The supported deployment is Docker Compose, installed and managed by the included liquibase-platform CLI. The images are standard OCI images and the application is stateless, so customers running Kubernetes or ECS can deploy them using their own manifests; Liquibase does not currently publish a Helm chart or task definitions for those platforms. The only optional egress is to the LLM provider you choose to connect for AI Analysis (bring your own model), and it is removed entirely by hosting the model in your environment.
Your team needs only a browser and a URL; nothing is installed on their machines. The server ships with a CLI that drives its lifecycle, covering install, update, start, stop, status, logs, migrate, and uninstall. It is a convenience layer over the Docker Compose files in the bundle, and you run it as liquibase-platform.
Important: Two things to get right when you set up or upgrade. Use the update command to move to a newer version, never install --force, which regenerates the deployment’s database passwords and encryption key and leaves the existing data unreadable. And configure SMTP during setup, because without it there is no password recovery for anyone who gets locked out.
Licensing: Change Intelligence and Change Governance are licensed modules activated by your Liquibase Secure license. If your installation is not licensed for a module, that module’s permissions are inactive and its capabilities are limited or unavailable, while Core services remain fully administrable. Contact your Liquibase account team for licensing details.
Change Intelligence
Change Intelligence is the visibility module of Liquibase Secure Server. It treats every Liquibase operation as first-class telemetry: each deployment, rollback, policy check, and drift detection run produces a structured operation record that flows into a governed observability layer, so teams can identify risk earlier, triage failures faster, and capture audit evidence automatically, without slowing delivery. For architecture, security posture, data flow, and sizing guidance, see the Change Intelligence Technical Overview.
One view across the database estate
The Dashboard is the front page of the web app and opens on three groups of measurements, each of which is also its own page under Monitor, alongside a full list of every operation. Database Changes covers the DORA metrics: Deployment Frequency, Change Failure Rate, Rollback Rate, and Cycle Time. Policy Checks covers Pass Rate, Database Violations, Changelog Violations, Critical and Blocker, and coverage across your databases and changelogs. Drift Detection covers Drift Rate, Drift Detected, Total Drift Items, Avg Drift Items, and Database Coverage. Each measurement runs over a 7, 30, or 90 day window and compares that window against the three before it, so you see the direction as well as the number.
You organize the estate by registering your projects, changelogs, and database connections, and by grouping connections into pipelines that describe the path a change takes to production. Every dashboard and list shares one filter bar covering time range, project, connection, changelog, outcome, and free text, and you can save the filters you use often or share one as a link. Existing projects are migrated to a default pipeline automatically when you upgrade, keeping their deployment status and history.
From signal to root cause, fast
Open any operation and you get its status, duration, target database, the command that ran, and its captured logs. Instead of a literal command line, you see the configuration that was actually in effect, with each value labeled by where it came from: a flag, an environment variable, or a properties file. That matters because a command line never shows what was merged in at runtime. Values that look like passwords, secrets, tokens, keys, or credentials are stripped on the machine that ran the command, before anything is sent, and a second independent pass on the server redacts anything that slipped through. There is no way to reveal them from the interface.
Results are broken down for the question you are actually asking. Policy check results group by severity, by check, by changeset, and by database, and the by-check view lists every check that ran, including the ones that found nothing. Policy check operations arrive through the same path as deployments, so policy outcomes appear alongside deployment and drift evidence without requiring a Change Governance license.
Optional, on-demand AI Analysis with your own model
AI Analysis is optional and is off by default. Nothing else in Change Intelligence depends on it: dashboards, operation details, policy results, and drift findings work exactly the same whether or not it is ever turned on, and no operation data is sent to any AI provider unless an operator configures a provider and an administrator enables the feature for a workspace. Organizations that cannot use AI can simply leave it off.
For teams that choose to use it, AI Analysis follows a bring-your-own-model (BYOM) approach. Liquibase does not host, bundle, or route traffic through a model of its own; you connect the LLM provider of your choice, whether OpenAI, Anthropic, Google, or any OpenAI-compatible endpoint, which includes self-hosted and local models, so inference can stay entirely inside your network and under the AI governance, data-handling, and procurement terms you already have in place. With a model connected, Liquibase can summarize an operation and analyze it when there are warnings or errors to explain. When a user explicitly invokes Summarize or Analyze Failure on a specific operation, the server calls the provider you configured and nothing else. The provider, model, and endpoint are set once per installation, so a single operator-controlled decision governs where inference happens; AI Analysis is then enabled per workspace, and there is never automatic outbound LLM traffic. The result is saved with the operation, attributed to the model and the time it ran, so it becomes something the team can read later rather than a one-off answer.
Catch drift early
Drift detection runs at the cadence you configure, typically as a scheduled CI/CD job, and the results populate a trend view alongside individual drift findings. Drift shows added, removed, and modified objects with their full definitions in a familiar side-by-side diff, together with the execution log that produced the finding, and tells you how long ago each item was first detected, so you can tell a new problem from an old one. Drift also carries its own indicator separate from whether the operation succeeded, because a run can finish cleanly and still have found drift.
Audit ready by design
Change Intelligence captures an immutable record of operations alongside the Core audit log of permission and configuration changes. Operations are immutable once ingested, AI analyses are persisted with the operation they describe, and security reviewers can answer questions like "who had access to this project on this date" from inside the product without needing elevated permissions on other systems. See Security: SSO and RBAC for the permission model.
Change Governance
Change Governance is the centralized policy management module of Liquibase Secure Server. It replaces local and remote file wrangling with a graphical, searchable, shareable library of policy assets (catalogs, packages, and checks) and maps that library to the entities teams already operate (projects, pipelines, database connections, and changelogs) through named Assignments. Policies are written once and reused across releases, applications, and lines of business; successful compliance workflows are copied, tuned, and shared instead of rebuilt. For architecture, permissions, and data flow, see the Change Governance Technical Overview.
Policies: catalogs, packages, and checks
In the web interface you can browse the checks that ship with Liquibase, import a checks settings file you already have or a checks package zip exported with checks export, organize checks into packages and catalogs, rename them, and change a check’s parameters, all without editing a file. Saving a configuration offers Save to overwrite or Save As to create a renamed copy in any catalog and package you have access to; copying a shipped check and customizing the copy keeps the original intact, and later changes to a copy never affect the source.
Every workspace starts with the Liquibase Default Catalog, a read-only copy of the 59 checks built into Liquibase Secure 6.0, grouped into seven packages named after the check categories introduced in 5.2, and you can check it for updates as Liquibase adds to it. Starting with 6.0 every check lives in a package (legacy uncategorized checks land in an "Uncategorized Checks" package). Checks can be enabled or disabled individually or in bulk across a package, and every check and package carries version history that records who changed what, with rollback to a prior check’s version just a click away.
Assignments: policy without pipeline changes
Assignments connect your policy configuration to a run. You pick the checks or packages you want and the assets you want them to run against, choosing from your workspace, projects, pipelines, database connections, and changelogs, and Liquibase gives the Assignment an immutable ID. Passing --assignment-id=<UUID> to liquibase checks run (or checks show) collects that Assignment’s checks from the server and runs them on the executing host, so a pipeline no longer needs a checks settings file on disk, and pipeline managers do not need to track local and remote files to set up pipeline jobs. Comma-separate the IDs to run up to 50 Assignments together, de-duplicated, so a check referenced more than once is only run once.
Because the Assignment ID never changes, policy authors can add, remove, or tune checks and re-target the Assignment without any change to pipeline configuration: changing the Assignment changes the next run. A single pipeline or connection can carry several Assignments, so a DBA group, a platform team, and a security review group can each enforce their own concerns on the same target and run them independently; a long compliance sweep does not block a short coding-standards check.
Adopt incrementally
Adoption does not have to be all or nothing. The checks settings file continues to work exactly as before. When you pass both, --assignment-id wins and Liquibase logs the local file it skipped. Checks still execute where they always have: in the Liquibase Secure CLI on the host that already has access to the target. Change Governance stores and resolves the configuration a run consumes and, when reporting is enabled, receives the outcome for Change Intelligence.
Built for shared ownership
Governance is something a team shares, so the interface is built around who may change what. Permissions decide who can see, use, and edit a catalog, a package, or an Assignment. Assets you can view but not assign appear without a checkbox, so you never capture them by selecting a parent, and you can request access to the ones you cannot reach. Saving is never silent: the save dialog itemizes what the change affects before it is applied, the save applies atomically, every change is recorded in the audit log with who changed what, and the owners of affected assets are notified. Removing a package from an Assignment, or an Assignment entirely, requires a confirmation step.
Note: The governance interface needs Liquibase Secure Server. Policy checks themselves still run from the command line without it.
Change Automation
Change Automation is the command-line engine at the center of Liquibase Secure and the component that applies database change. It installs on the workstations and CI/CD agents that already perform deployments, connects to more than 65 database platforms, and converts a proposed schema change into a governed operation: previewed as exact SQL before it runs, checked against policy, applied under a lock, recorded in a tamper-evident ledger on the database itself, reversible one changeset at a time, and evidenced in a report a reviewer can read. Change Automation was named Secure Automation in Liquibase Secure 5.x; it is the same command-line tool your pipelines already run, and 6.0 substantially expands what it can do, with cloud-native database connectivity, new changeset targeting attributes, stricter validation, faster inspection of large schemas, and cleaner, automation-friendly output, all described below. For the full capability model, runtime posture, and integration architecture, see the Change Automation Technical Overview.
The changelog remains the central artifact. Whether it is authored in an IDE, produced by an external tool, captured from an existing database, or generated by an AI assistant through Liquibase’s own APIs, Change Automation treats it identically: committed to version control, checked against policy, previewed as SQL, deployed, tracked, and reported on. Policy checks are deterministic and do not distinguish a human-authored changeset from a generated one, which is what makes the governance path for AI-written change the same path as for any other change.
What is new in Change Automation 6.0, as a delta from Liquibase Secure 5.2.x:
Database Connectors: cloud authentication and secrets management
IAM authentication for Amazon RDS and Aurora
Liquibase Secure now connects to Amazon RDS and Aurora for PostgreSQL and MySQL using AWS IAM authentication with short-lived tokens instead of static database passwords. Teams authenticate with their AWS identity and can assume a role to reach databases in other AWS accounts. This removes long-lived passwords from pipelines and properties files, aligns database access with existing AWS identity policy, and shrinks the blast radius of a leaked credential to minutes.
IAM authentication and Secret Manager for Google Cloud
Liquibase Secure adds IAM authentication for Cloud SQL for PostgreSQL and MySQL, either through the Cloud SQL Java Connector or a lighter token-as-password option, and can pull values such as password, url, and username straight from Google Secret Manager. Teams on Google Cloud get the same passwordless, vault-backed connection pattern already available on AWS, so credentials never have to be written to disk or into a CI variable.
Azure Key Vault secrets
Liquibase Secure can now retrieve secrets, keys, and certificates from Azure Key Vault, joining the existing AWS Secrets Manager and SSM Parameter Store integrations. A property holds a reference to a vault entry rather than a credential, so Azure-centric organizations can enforce their vault policy on Liquibase the same way they do for every other workload.
Mixed authentication for target and reference databases
You can now use different authentication mechanisms for your target and reference databases when you run diff or diff-changelog on Snowflake, Databricks, MongoDB, and AWS RDS. Comparing a production database that uses cloud IAM against a reference that uses a password, or vice versa, no longer requires workarounds, which makes drift detection and changelog generation practical across heterogeneous environments.
Changeset targeting and filtering
New changeset attributes: teams, releases, keywords, and conditions
Four new changeset attributes, teams, releases, keywords, and conditions, let you tag changesets with the organizational metadata you actually plan by, and the matching --teams-filter, --releases-filter, --keywords-filter, and --conditions-filter flags select on them at run time. Add the @ operator to any of these filters for strict matching, so a filter selects only changesets with the exact value. Teams can deploy one release’s changes, one team’s changes, or one flagged subset from a shared changelog without maintaining parallel context and label schemes, and validate --strict checks the new attributes for typos before anything runs. These new attributes are also included in status --verbose output.
Checks Targeting
Checks Targeting lets you set persistent exemption or restriction rules so a check can skip or exclusively inspect specific changesets without disabling the check or editing the changelog. Use the new changeset attributes (teams, release, conditions, keywords) or the classic attributes of labels and contexts to filter the specific changesets to target with specific checks. In this way, an approved exception to a naming standard, or a check that should only look at one team’s changesets, becomes a rule that travels with the checks configuration. This keeps policy enforcement on for everyone else while eliminating the noise and the audit questions that come from suppressing a check globally.
Policy checks
Run checks from a Change Governance Assignment
checks run and checks show commands optionally accept --assignment-id to resolve their configuration from Liquibase Secure Server instead of a local checks settings file (see Change Governance). Pipelines reference an immutable ID, policy authors change the checks behind it, and the next run picks up the change with no pipeline edit. Local checks settings files continue to work unchanged and are not deprecated.
Stricter validation and partial customization
validate --strict now validates the new teams, releases, keywords, and conditions attributes and catches bad property names in include and includeAll blocks, and checks customize accepts partial updates so you can change one property without rebuilding the whole check. Configuration mistakes surface before deployment rather than as silently ignored settings, and check tuning becomes a one-line change.
Shared modules for custom Python checks
Custom Python policy checks can now import shared modules from other directories. Teams maintaining a library of organization-specific checks can factor common parsing and helper logic into one place instead of duplicating it in every check script, which makes large custom check suites easier to test and maintain.
More accurate results and attribution, better performance
Keyword-based checks such as SqlGrantWarn no longer misfire on data values that happen to look like reserved words, and the checks report now attributes violations correctly when you use checks packages with multiple configuration files, so nothing is counted twice or listed under the wrong file. Policy checks based on SQL patterns also run dramatically faster against changelogs with large multi-value INSERT statements, cutting runs that used to take minutes down to seconds.
Changelog generation
One file per table with object changelogs
generate-changelog and diff-changelog can now organize output as one file per table with --object-changelogs=by-table, so a table and everything tied to it lands in a single file. generate-changelog also infers the SQL dialect from the database you connect to when your filename leaves out a database-type segment. Teams bringing an existing estate under governance get a changelog layout that mirrors how they think about the schema and reviews cleanly in pull requests.
Generated changelogs that match the schema
Generated changelogs are more faithful to the schema they came from. Index prefix lengths survive on MySQL and MariaDB, TINYINT(1) and TIME(N) columns keep their types, a standalone index is no longer dropped when it shares columns with a unique constraint on PostgreSQL and MySQL, and a schema-filtered run on Microsoft SQL Server no longer pulls in database-level DDL triggers from outside the schemas you asked for. On PostgreSQL, diff-changelog now orders a view update ahead of a dropColumn the view still uses, so the changelog deploys without you reordering changesets by hand. Less manual clean-up after generation means faster onboarding of existing databases and fewer surprises when the generated changelog is first deployed.
Database support
PostgreSQL
Liquibase Secure supports PostgreSQL 18 VIRTUAL generated columns end to end. Together with the diff-changelog ordering fix and index handling described above, PostgreSQL teams can adopt the newest engine features without stepping outside the governed path.
MongoDB
set-labels and set-contexts now work on formatted Mongo changelogs, so the same environment-scoping workflow used on relational changelogs applies to MongoDB.
Amazon DynamoDB
Liquibase Secure validates createDynamoTable attribute definitions and tags up front, and lets you run consecutive changesets that create or delete a global secondary index on the same DynamoDB table. Errors surface at validation rather than mid-deployment, and index management no longer requires splitting work across runs.
Couchbase
On Couchbase, the commands that do not apply now tell you so instead of failing with an internal error, so unsupported operations are clear rather than confusing.
MySQL, MariaDB, and SQL Server
Snapshot and generation fidelity improvements for MySQL and MariaDB (index prefix lengths, TINYINT(1), TIME(N)) and for Microsoft SQL Server (schema-filtered DDL triggers) are described under Changelog generation; performance improvements for these platforms are described under Performance.
Performance
Faster on large schemas
snapshot, diff, and generate-changelog are now much faster on large schemas across PostgreSQL, SQL Server, MySQL, MariaDB, Db2, Databricks, and BigQuery. Snapshots of MySQL and MariaDB databases with many stored procedures and functions are roughly 25 to 30 percent faster, because Liquibase fetches those definitions in parallel instead of one at a time. Scheduled drift detection and changelog generation against production-sized schemas finish in a fraction of the time, which makes frequent drift scans practical and shortens pipeline stages.
CLI output and logging
Machine-readable STDOUT, human-readable STDERR
Liquibase now writes only machine-readable results, such as SQL, JSON, and diff output, to STDOUT. Everything else, including the banner, progress messages, and warnings, goes to STDERR. Scripts that capture update-sql output or parse JSON no longer need to strip banners and progress lines, and piping Liquibase into other tools works the way Unix conventions expect. Scripts that read STDOUT from commands like update, rollback, and dbDoc should be reviewed; set --legacy-stream-routing if you need time to migrate.
Control verbosity, see what changed
The new --verbosity flag, with quiet, normal, or verbose options, controls how much detail Liquibase prints, and a new --show-rows-affected flag reports the rows each statement affected when you turn it on. Benign command failures no longer print a full stack trace unless you run with --log-level=FINE. Console output is shorter and more useful in a CI log, while the detail is still one flag away when you need it.
Logging that stays out of your application’s way
If you embed Liquibase Secure, for example in Spring Boot, running a command no longer changes your application’s logging levels or handlers, because logging now runs through SLF4J. Your logs are a separate stream from console output: setting --log-level or a log file governs your logs independently of console verbosity, so a quiet run still records everything you asked it to.Structured JSON logging keeps working on the new backend, writing one JSON object per line so each record parses on its own. And, if a message has an error code, it gets a new liquibaseErrorCode key in the JSON object. Log aggregation and alerting can key on a stable classification rather than on message text.
Credentials and SQL handled as written
A failed connection no longer echoes your password when your JDBC URL carries credentials in the authority form, and the Maven plugin no longer prints database credentials in verbose output. Liquibase also no longer strips comments from your SQL by default, so comments you write in a stored procedure body reach the database as written. These changes close two common paths for credential leakage into CI logs and keep deployed code faithful to what was reviewed.
Error codes and exit codes
When a deployment fails, the first question is usually "what happened, and is it something I can fix?" Liquibase 6.0 answers that question from the start by improving the error and exit codes surfaced by the product. These improvements help you spend less time digging through logs, get to fixes faster, and let your CI/CD and other automation pipelines respond to failures intelligently.
First, exit codes have been reviewed and adjusted to ensure they have consistent meaning across the product. Exit code 0 still means success, and a failure’s exit code now reflects how that failure is classified rather than always being 1, so your pipeline automation can more readily determine whether an error occurred because of the changes you are deploying or because of something in the environment. Scripts that check for a literal exit code of 1 should be updated.
Second, new error codes have been added throughout the product to provide a stable reference point for errors. You can search for error information in the docs, use the codes in your alerting, or, if needed, share them with support. Structured JSON logs carry the code in the new liquibaseErrorCode field.
Developer Productivity
Liquibase closes the gap between where database changes are authored and where they are governed. Liquibase Secure Developer for VS Code brings changelog authoring, local operations, and policy enforcement into the editor developers already use. The Liquibase AI Changelog Generator lets AI assistants and coding agents produce changesets that are generated by Liquibase’s own APIs rather than written from a model’s memory. Both components run entirely on the developer workstation or CI agent; neither introduces a hosted service, an inbound network path, or a Liquibase-managed runtime dependency. For architecture, security posture, and analytics details, see the Developer Productivity Technical Overview.
Liquibase Secure Developer for VS Code
The Liquibase VS Code extension (version 1.2.1) creates changelogs in all four supported formats, Formatted SQL, XML, JSON, and YAML, along with changesets, defaults files, flow files, and policy checks configuration files, with format-aware snippets and the current dbchangelog XSD bundled so validation and completion work without additional setup. It exposes the operational command families from the command palette or a context menu on any recognized Liquibase file: status and validation, update, rollback, policy checks, history, and flow execution, each with an in-editor help command that links to the relevant documentation.
Every update and rollback command is registered once and produces two adjacent menu entries, the executing command and its -sql preview counterpart, so reviewing generated SQL before applying it is the neighbouring menu item rather than a separate CLI invocation to recall. A React-based configuration editor replaces hand-edited properties files and manages JDBC driver dependencies per database type. The extension requires only LIQUIBASE_HOME, JAVA_HOME, and LIQUIBASE_LICENSE_KEY, auto-detects all three, and opens an installation wizard rather than an error if detection fails. Policy checks run from the extension are the same checks from the same configuration file that the pipeline runs, so a change that passes locally passes in CI for the same reasons, and a change that fails locally is detected before moving in the pipeline to consume a build slot. Requirements: Liquibase Secure 5.0 or newer, JDK 17 or newer, and a Liquibase license key.
Liquibase AI Changelog Generator
The Liquibase AI Changelog Generator (version 1.0.0) is a Model Context Protocol (MCP) server that exposes thirty tools, covering table, column, index, view, procedure, function, trigger, sequence, and constraint operations, plus raw SQL, SQL file, and validation tools. The architectural point that matters for governance is that the language model does not write the changeset. The model interprets developer intent and calls a tool with structured parameters; the changeset itself is generated by Liquibase’s native Java change classes, then validated against an ephemeral in-memory H2 database before it is returned. A malformed or invalid change fails at generation time rather than at deploy time, and a model that misunderstands a request produces a wrong but valid changeset the developer can see and reject, never invalid syntax that fails in a pipeline.
Output is XML by default, or Liquibase Formatted SQL with database-specific syntax for any of twelve supported dialects, with optional explicit rollback blocks. It speaks STDIO and works with any MCP-compatible client, including VS Code and GitHub Copilot, Claude Code, and Claude Desktop, and is distributed through the public MCP Registry, Docker Hub, GitHub Container Registry, Maven Central, the Liquibase package repository, and JBang. It requires no database connectivity of any kind, makes no LLM calls of its own, has no listening socket, and can operate fully air-gapped once the JAR or container image is present. Its only credential is a Liquibase license key.
Deployment Connectors
Liquibase Secure 6.0 establishes the platform that Deployment Connectors will build on. Deployment Connectors extend governed database change into the enterprise systems teams already use: ServiceNow for approvals and change requests, GitHub for pull request workflows and pipeline orchestration with database-specific controls, and Terraform for infrastructure-managed databases, so teams keep their existing workflows while strengthening governance. Deployment Connectors are not part of the 6.0.0 release; read about the roadmap in What’s next for Liquibase Secure: Change Intelligence and new Deployment Connectors.
Security: SSO and RBAC
Liquibase Secure Server ships with enterprise authentication and an authorization model designed from a blank sheet against the access control patterns of regulated environments. Both are Core services shared by Change Intelligence and Change Governance. For the complete model, including permission vocabulary, resolution rules, and compliance evidence guidance, see the Liquibase Secure Role-Based Access Control Technical Overview.
Authentication and single sign-on
People sign in with an email and a password that the server manages itself, and operators can close self-service registration for the whole installation so new users arrive only through SSO or an administrator’s invitation. A Workspace Admin can also configure Microsoft Entra single sign-on per workspace, in the application and with no operator-level environment changes, through either OIDC or SAML 2.0 (one protocol active per workspace at a time), restrict it to your tenant, and let SSO and password sign-in coexist while you migrate. Disabling or deleting an SSO provider revokes the sessions it issued rather than leaving them to expire. Multi-factor authentication is delegated to your identity provider: where the Entra tenant requires MFA or conditional access, those policies apply to every SSO sign-in, and the server carries no separate authenticator enrollment or recovery-code custody of its own. First-time SSO arrivals are provisioned just in time into a Pending group with zero permissions until an administrator assigns them, and two lockout guards prevent configuration mistakes: the last enabled SSO provider cannot be disabled while registration is closed, and the last remaining administrator cannot be removed. Scope for this release: user provisioning is just-in-time only (SCIM is deferred), logout is local to Liquibase Secure Server (federated single logout is deferred), and Entra group claims are not consumed, so group membership is assigned in Liquibase Secure Server rather than inherited from the directory.
API tokens and service principals
For pipelines, each workspace issues API tokens that are shown once, stored only as a hash, and can be rotated or revoked at any time; every operation is attributed to the token that sent it. Two kinds of token exist. Service principal tokens belong to a distinct machine principal type scoped to one or more projects: they can post operation data and resolve Change Governance Assignments for the assets they deploy, but cannot sign in to the web application, cannot join groups, and cannot read any operation, dashboard, or permission data, so a pipeline token that leaks from a CI log cannot be repurposed as a read credential for the estate. User API tokens carry a human user’s permissions for interactive and scripted API use. Issue a service principal for every CI/CD pipeline and reserve user tokens for people.
Role-based access control
Access is granted to groups, not individuals, and permissions are granted through templates and groups with a default set in place from the moment a workspace is created. Six persona-based, immutable templates ship in every workspace, Workspace Admin, Application Developer, DBA, Platform/DevOps Engineer, Security Reviewer, and Service Principal, each applied to a group at a scope: the whole workspace, a list of projects, or a list of specific database connections. Customers adjust a group’s access with an overlay rather than forking a template, so Liquibase can improve templates in later releases without discarding customer configuration. Exceptions are handled with direct grants and denies on individual entities, which is what lets a single sensitive operation be contained even from principals whose template would allow it, and a named incident responder be re-admitted. Ownership is an independent source of access, and an entity is never left ownerless when a user is deactivated or a group deleted.
Enforcement never asks what template a user holds. Every authorization decision resolves a fine-grained permission name (domain:action:resource) at a scope, with one fixed precedence: a direct grant wins outright, a direct deny overrides the baseline, and the baseline is the union of templates, overlays, ownership, and licensed-module grants. Reads are governed throughout, list endpoints filter to what the caller may see, and a view permissions page lets a Security Reviewer answer "who has access to this project" from any project page. Every permission-changing action, from group membership and template assignment to token lifecycle and SSO configuration, is captured in an immutable, searchable, exportable audit log.
Boundary: Liquibase Secure governs access to its own records, the platform’s record of database change and governance configuration, not access to the databases themselves. Who can connect to a database, and with what rights, remains the province of the database’s own privilege system.
Action required when you upgrade
Scripts that read STDOUT. Commands like
update,rollback, anddbDocnow write entirely to STDERR. Set--legacy-stream-routingif you need time to migrate.Scripts that check exit codes. Liquibase Secure 6.0 reviews and adjusts CLI exit codes so they have consistent meaning across the product; see Error codes and exit codes. Exit code 0 still means success, and a failure’s exit code now depends on how that failure is classified rather than always being 1.
Your own Python virtual environment. The embedded Python runtime moves from 3.11 to 3.12 (GraalPy 25.0.2). If you point
liquibase.script.python.executablePathat your own environment, recreate it for Python 3.12 before you upgrade, or policy checks will fail withModuleNotFoundError. If you use only the built-in checks or the embedded virtual filesystem, no action is needed.Db2 for z/OS tracking-table properties. Liquibase 6.0 removes
liquibase.db2z.trackingTables.location.tablespace,liquibase.db2z.databasechangelog.index, andliquibase.db2z.databasechangeloglock.index. Remove them from your configuration.Changesets using a dbms-scoped
<sqlFile>. Liquibase 6.0 fixes a bug that left these changesets with the checksum of an empty string, and it repairs the stored checksum on your next update. For arunOnChangechangeset the repair re-runs it once, so if its SQL is not idempotent (a plainINSERTrather than aMERGE), that run can insert one duplicate row.
Security vulnerability report
This release includes updates to internal platform components and third-party dependencies to address known security vulnerabilities and strengthen the overall platform security posture of Liquibase Secure. These updates help organizations maintain secure deployment environments, improve compliance readiness, and reduce operational risk associated with outdated software components.
CVE summary
Liquibase Secure also includes VEX (Vulnerability Exploitability eXchange) files with every release to communicate Liquibase’s official assessment of reported CVEs. Refer to the VEX file included with the 6.0.0 release (files ending in .vex.json) for the complete list of vulnerability assessments and exploitability status. For more information about VEX files and how to interpret their status values, see the VEX documentation.
Full list of changes
- Cloud Authentication(INT-1960, INT-2034, INT-2035) You can now connect to AWS Aurora and Amazon RDS databases (PostgreSQL and MySQL) using IAM database authentication. Set your password value to
aws-rds-iamand Liquibase generates a short-lived IAM token for each connection instead of using a static password. You can supply the AWS region withliquibase.rds.iam.regionand connect across accounts by assuming a role withliquibase.rds.iam.roleArn. SSL must be enabled on the connection. - Cloud Authentication(INT-2044, INT-2045) You can now connect to GCP Cloud SQL for PostgreSQL using IAM database authentication in the new Liquibase GCP extension. Set your password value to
gcp-cloudsql-iamand Liquibase authenticates through the Google Cloud SQL Java Connector, so you no longer need the Cloud SQL Auth Proxy. You can impersonate a service account withliquibase.cloudsql.targetServiceAccount, and connection problems now surface as clear error messages. - Cloud Authentication(INT-2056) You can also authenticate to GCP Cloud SQL by minting a short-lived OAuth2 token and passing it as the database password (
password: gcp-cloudsql-iam-token), for both PostgreSQL and MySQL. This is a lighter alternative to the connector and works over a standard JDBC connection through the Cloud SQL Auth Proxy. It requires SSL on the JDBC URL, or the token travels in plaintext. - Cloud Authentication(INT-2058) You can now resolve configuration values such as
password,url, orusernamefrom Google Secret Manager using agcp-secret-manager,<reference>prefix. This mirrors the existingaws-secretsmodifier and works with a full resource name or a shorthand name resolved against your default GCP project. - Cloud Authentication(INT-2186, INT-2187, INT-2188) You can now pull secrets, public keys, and certificates from Azure Key Vault, so you can keep values like your database password out of your Liquibase configuration and let Liquibase retrieve them with your existing Azure credentials.
- Cloud Authentication(INT-2211) You can now use different authentication mechanisms for the target and reference databases when running
diffordiff-changelogon Snowflake, Databricks, MongoDB, and AWS RDS. Each platform's auth selector now has reference-scoped counterparts, so your target database can use key-pair, OAuth, OIDC, or IAM authentication while a legacy reference database still signs in with a password. Set these keys in your defaults file, as environment variables, or as Java system properties. They are not accepted as command-line flags. - Change Targeting and Policy Checks(SECURE-98) Liquibase now supports four new changeset attributes (
teams,releases,keywords, andconditions) that you can use to tag your changesets and filter which ones run with the matching--teams-filter,--releases-filter,--keywords-filter, and--conditions-filterflags, so you have more precise targeting without overloading labels and contexts. - Change Targeting and Policy Checks(SECURE-503) You can now use the
@symbol to force strict matching inteams-filter,releases-filter,keywords-filter, andconditions-filter, the same way it already works withlabel-filterandcontext-filter. Putting@in front of a value (for example,--teams-filter=@frontend) runs only changesets with exactly that value. You can combine filters too, so--teams-filter=@frontend --releases-filter=v1runs only changesets tagged with both. - Change Targeting and Policy Checks(SECURE-100) Checks targeting lets you set persistent ignore or include rules for
checks run, so you can skip or exclusively inspect specific changesets with a given check without disabling the check or editing your changelog. - Change Targeting and Policy Checks(SECURE-152) Running
validate --strictnow validates theteams,releases,keywords, andconditionsattributes, so you can catch typos and empty values before they cause problems at deploy time. - Change Targeting and Policy Checks(SECURE-105) Running
validate --strictnow catches invalid property names inincludeandincludeAllblocks, so typos or unrecognized attributes are reported before they cause unexpected behavior. - Change Targeting and Policy Checks(SECURE-101) You can now update individual check properties with
checks customize --configswithout specifying every parameter, so you can change just the severity or message without rebuilding the full check. - Change Targeting and Policy Checks(DAT-22576) Custom policy check Python scripts can now import shared modules from other directories and from sibling files. A new
--checks-scripts-python-pathargument adds directories to the Python import path, and the script's own directory is added automatically. When the option is not set, existing behavior is unchanged. - Change Targeting and Policy Checks(SECURE-479) Liquibase now applies custom regular-expression policy checks statement by statement, so
checks runcompletes quickly on large SQL changesets that previously caused it to stall. - Change Targeting and Policy Checks(SECURE-89) Keyword-based checks such as
SqlGrantWarn,SqlRevokeWarn, andWarnOnUseDatabaseno longer flag DML statements when reserved words appear as data values. For example, anINSERTwith an address like101 Grant St.no longer triggersSqlGrantWarn. These checks now only flag DDL and DCL statements. - Change Targeting and Policy Checks(SECURE-44, SECURE-45, SECURE-46, SECURE-47) Liquibase now validates parameter values immediately when you run
checks customizein headless mode, with or without--configs, and tells you the allowed options instead of hanging, crashing, or saving a configuration that fails later. - Change Targeting and Policy Checks(SECURE-41) Changelog-scoped policy checks no longer appear in your results when you run
checks run --checks-scope=DATABASE. - Change Targeting and Policy Checks(SECURE-53) Liquibase now correctly strips
//comments from MongoDB formatted changesets when you usestrip_comments()in a custom policy check. - Change Targeting and Policy Checks(SECURE-346)
SqlUserDefinedPatternCheckfindings on large changesets now include the matched text and line number, consistent with findings on smaller changesets. - Change Targeting and Policy Checks(SECURE-372) Liquibase now rejects duplicate object type values when you customize a check (for example,
TABLE,TABLE) and ignores duplicates already saved, so each violation appears once in the console output. - Change Targeting and Policy Checks(DAT-21274) Fixed an issue where the Checks Report showed the
OPERATOR = EQUALSparameter once per violation for ReservedKeywords checks. On large changelogs, the accumulated duplicates inflated the report and could cause out-of-memory failures. This issue was present in Liquibase Secure 5.1.1. - Change Targeting and Policy Checks(SECURE-490) Running
liquibase checks describenow shows you every valid option for a check right alongside its current settings, with no extra flag required. For each configurable parameter, you'll see the default value next to what it's currently set to, along with the full list of valid choices, and every check reports its complete set of severity levels and enabled and disabled options. Whether you're building a GUI panel for check configuration or just exploring what's available, you get the full picture every time you run the command. - Change Targeting and Policy Checks(INT-2142)
RedshiftDatabasenow extends the newAbstractPostgresDatabaseclass instead ofPostgresDatabase. If your custom extension usesinstanceof PostgresDatabaseto detect Amazon Redshift, that check no longer matches. Useinstanceof AbstractPostgresDatabaseto detect any Postgres-family database. Real PostgreSQL connections are not affected.snapshotandgenerate-changelognow work on Amazon Redshift. They previously failed withfunction array_position(smallint[], smallint) does not exist. - Change Targeting and Policy Checks(SECURE-547) Policy checks based on SQL patterns (such as checks for
ALTER INDEXorCREATE TABLE) no longer take minutes to run against changelogs containing large multi-valueINSERTstatements, so your checks pipeline finishes in seconds instead of hours. This issue was present in Liquibase Secure 5.1.0. - Change Targeting and Policy Checks(SECURE-49) Liquibase now correctly attributes policy check violations in the checks report when you use checks packages with multiple configuration files, so violations are no longer counted multiple times or shown under the wrong configuration file
- Change Targeting and Policy Checks(SECURE-95) If you used PII or PHI checks against DynamoDB changesets written in YAML or JSON, insert and put statements weren't being scanned, so the check could report no violations even when identifiers like
STREET_ADDRESSwere present in your data (changesets in XML weren't affected). This has been fixed, so PII and PHI checks now scan DynamoDB PartiQL changesets consistently across YAML, JSON, and XML changelog formats. - Change Targeting and Policy Checks(SECURE-655)
checks runandchecks showaccept a new--assignment-idparameter, which points the command at a checks assignment configured in Governance instead of at a local checks settings file. Separate several assignment IDs with commas.--checks-settings-filecontinues to work, and checks that come from an assignment are read-only in the CLI. - Change Targeting and Policy Checks(SECURE-607)
status --verbosenow reports theteams,releases,keywords, andconditionschangeset attributes alongside the ones it already showed, so you can see which changesets carry them without opening the changelog. - Change Targeting and Policy Checks(GOV-5) Liquibase 6 adds a governance interface for policy checks. You can browse the checks that ship with Liquibase, import a checks settings file you already have, organize checks into packages and catalogs, and change a check's parameters, all in the web interface rather than in a file. Copying a shipped check and customizing the copy keeps the original intact. Assignments connect that configuration to a run. You pick the checks you want and the things you want them to run against, choosing from your workspace, projects, pipelines, database connections, and changelogs, and Liquibase gives the assignment an ID. Passing
--assignment-id=<UUID>toliquibase checks runcollects that assignment's checks from Liquibase and runs them, so a pipeline no longer needs a checks settings file on disk. Comma-separate the IDs to run more than one assignment. Two teams can hold separate assignments against the same pipeline and run them independently, so a long compliance sweep does not block a short coding-standards check. The checks settings file continues to work exactly as before. Saving an assignment tells you what the change affects before it is applied. Assignments and check configurations both keep a version history, and you can restore an earlier version. - Change Targeting and Policy Checks(SECURE-706) When a policy check triggers on a changeset that a checks targeting rule affects,
checks runconsole output atINFOlevel now includes the targeting file path, whether the rule isEXEMPTorRESTRICT, and, when set, the rule's reason and expiration. Previously this information only appeared in the HTML report, so teams who read console logs instead of the report can now see which targeting rules affected a run's results. - Change Targeting and Policy Checks(SECURE-712) A new
liquibase checks exportcommand bundles a checks package, and optionally its linked checks-settings files and Python check scripts, into a single archive so you can migrate your policy checks configuration into Change Governance. Choose the archive type with--format(zipby default, ortar,targz), and use--linked-checks-filesand--python-scriptsto choose whether those files are packaged into the archive or left as file path references. In this release,liquibase checks exportonly builds the archive. You still import it into Change Governance yourself. - Change Targeting and Policy Checks(SECURE-612)
checks describenow reports the secondary parameters that a mode-select value brings into play, such asCOLLECTION_NAMEonMongoChangetypeAttributesorBILLING_MODEonDynamoChangetypeAttributes, along with the values you configured, so it matches whatchecks showalready displayed. This issue was present in Liquibase Secure 5.2.0-5.2.2. - Performance(SECURE-267, DAT-22345, DAT-22346, DAT-22348, DAT-22349, DAT-22350) Liquibase now completes
snapshot,diff, andgenerate-changelogsignificantly faster on large schemas across PostgreSQL, SQL Server, MySQL, MariaDB, Db2, Databricks, and BigQuery. - Performance(SECURE-499, SECURE-553) Taking a snapshot of a MySQL or MariaDB database with many stored procedures and functions is now significantly faster. Liquibase fetches those definitions in parallel instead of one at a time, reducing snapshot time by roughly 25 to 30 percent on very large schemas, with identical content. The speedup also applies to
generate-changelog,diff-changelog, and, on your target database,diff. It applies to CLI runs. Maven plugin runs currently use the serial path and produce the same results. - Performance(SECURE-454) If you ran
diffagainst a large schema, Liquibase previously repeated the same environment variable and system property lookups for every object it compared, instead of doing it once. This has been resolved, sodiffnow reuses the same caching Liquibase already applies elsewhere, making your comparisons on large schemas noticeably faster with no change to the results you get. - Performance(SECURE-464) Liquibase no longer prints command output to your console by default when you embed it in your own application (for example a Spring Boot app).
- Performance(SECURE-790)
validateandchecks run --checks-scope=changelogno longer fail withOutOfMemoryError: Java heap spaceon a formatted-SQL changelog that ends in a large block comment. - Changelog Generation and Snapshot(SECURE-309) You can now generate changelogs organized as one file per table by passing
--object-changelogs=by-tabletogenerate-changelogordiff-changelog, so a table and everything tied to it lands in a single file instead of being scattered across per-type folders. - Changelog Generation and Snapshot(SECURE-556) If you name your changelog file without a database type segment (for example,
changelog.sqlinstead ofchangelog.snowflake.sql),generate-changelognow figures out the right SQL dialect from the database you connect to. Your per-object SQL files follow the same convention. If your filename already includes a segment, nothing changes. - Changelog Generation and Snapshot(SECURE-92) Liquibase update reports now hide the detail rows for skipped changesets while still showing the total skipped count in the summary, so reports stay readable even when hundreds of changesets are filtered out.
- Changelog Generation and Snapshot(INT-1847) Snowflake sequence snapshots now capture the
ordered(ORDER/NOORDER) andcommentproperties acrosssnapshot,diff,diff-changelog, andgenerate-changelog, which previously dropped them. Regenerate any existing Snowflake snapshots that include sequences, because older snapshots are missing these properties and will produce incorrect diff results. - Changelog Generation and Snapshot(INT-1914) Fixed an issue where
generate-changelogwith--should-snapshot-data=trueagainst Snowflake silently ignored the setting and captured no row data. Row data is now captured asinsertchangesets inobjects/inserts/sub-changelogs, matching other databases. - Changelog Generation and Snapshot(INT-1916) Fixed an issue where MongoDB snapshots captured only an index's key definition, name, and
uniqueflag, dropping 13 other attributes includingexpireAfterSeconds(TTL),sparse,partialFilterExpression,collation,hidden, and text index settings. These attributes are now captured and round-trip correctly. This issue was present in Liquibase Secure 5.1.0. - Changelog Generation and Snapshot(INT-1949) Fixed an issue where a formatted SQL changelog generated from a Snowflake schema with Dynamic Tables embedded a trailing semicolon in the query body, causing
diffto report a false query change after deploying the generated changelog. - Changelog Generation and Snapshot(INT-2010) Liquibase now generates MongoDB changelogs with views in dependency order, fixing an issue in 5.2.0 where a view could appear before the collections and views it relies on.
- Changelog Generation and Snapshot(INT-2041) Fixed a bug where
--should-snapshot-data=truewas silently ignored duringgenerate-changelogon Databricks, omitting row data without warning. - Changelog Generation and Snapshot(INT-2077) Liquibase now excludes its own MongoDB tracking collections (DATABASECHANGELOG, DATABASECHANGELOGLOCK, and DATABASECHANGELOGHISTORY) from
snapshot,diff,generate-changelog, anddiff-changelog, fixing an issue in 5.2 where these collections showed up as drift. Regenerate snapshots captured before this release for clean results. - Changelog Generation and Snapshot(INT-2213) Fixed an issue where
diff-changelogwithdiffTypes=compositetypedid not detect differences in composite type attribute data types, so real schema differences were silently omitted from the generated changelog. - Changelog Generation and Snapshot(INT-1771) Fixed an inconsistency in the "Database objects Validated" summary when running
checks run --checks-scope=databaseagainst Snowflake. Liquibase tracking tables are now excluded from the count, and view columns are now included, matching other databases. - Changelog Generation and Snapshot(INT-1846) Deploying
pro-snowflake:createDynamicTableagainst a non-Snowflake database now fails validation with a clear error instead of silently creating a regular table and dropping Dynamic Table attributes liketargetLag,refreshMode, andwarehouse. - Changelog Generation and Snapshot(INT-1319) Fixed an issue where enabling the
DATABASECHANGELOGHISTORYtable on Redshift causedupdateto fail withvalue too long for type character varying(256). TheEXECUTEDSQLandEXTENSIONScolumns are nowVARCHAR(65535)on Redshift, and existing history tables migrate automatically on the next update. This issue was present in every released version up to and including Liquibase Secure 5.2.2. - Changelog Generation and Snapshot(SECURE-286) Liquibase now correctly preserves
STRING(65535)column types when generating a changelog from BigQuery, instead of dropping the length to bareSTRING. - Changelog Generation and Snapshot(SECURE-483) Snapshot output for MySQL and MariaDB is now more consistent. Column type names are reported in standard uppercase JDBC format (for example,
VARCHARinstead ofvarchar), and stored function definitions preserve theirCHARSETclause, improving comparison across releases. - Changelog Generation and Snapshot(SECURE-485) Fixed a regression where
snapshotanddiffoutput for PostgreSQL and EnterpriseDB views could include an unexpected leading space and drop redundant parentheses around WHERE clauses, causing false view drift. View definitions now match byte-for-byte with prior output. - Changelog Generation and Snapshot(SECURE-488) Fixed
diffChangeLogon PostgreSQL to correctly handle schemas that differ only by constraint or index names, generating a valid, convergent changelog instead of one that failed on update. - Changelog Generation and Snapshot(SECURE-90) Liquibase now accurately remediates detected trigger changes in PostgreSQL, so drift-detection deployments no longer fail when a trigger already exists in the target database.
- Changelog Generation and Snapshot(SECURE-410) Fixed a bug where
createIndexon MySQL generated a SQL syntax error when deploying functional indexes withcomputed="true"columns, due to missing double parentheses required by MySQL 8.0.13 and later. - Changelog Generation and Snapshot(SECURE-43) You can now generate and deploy changelogs from MySQL 8.0 databases with expression defaults like
DEFAULT (CURRENT_DATE)without a SQL syntax error. - Changelog Generation and Snapshot(SECURE-214) Fixed an issue where deploying
addForeignKeyConstraintwithvalidate="false"against Db2 LUW created a fully enforced foreign key. Liquibase now appends theNOT ENFORCEDclause, matching Oracle and PostgreSQL, so redeploying preserves the constraint state and no longer causes false drift. - Changelog Generation and Snapshot(SECURE-158) Updated the
renameViewColumnsAndUpdateBodyrollback error message to explain thatoldBodyis required for rollbacks. Previously the rollback failed with an unclearNullPointerException. This issue was present in Liquibase Secure 5.2.0. - Changelog Generation and Snapshot(SECURE-376) Fixed an inconsistency in
validate --strictwhere an unquotednullchangeset attribute value was flagged in XML, YAML, and formatted SQL changelogs but silently ignored in JSON. - Changelog Generation and Snapshot(INT-2281)
generate-changelognow wraps a PostgreSQL generated column's expression in parentheses when needed, so you can replay changelogs for columns whose expression starts with a function call (such asmake_date(...)) without hitting a syntax error. This issue has been present since PostgreSQL generated column support was added in 2023. - Changelog Generation and Snapshot(SECURE-689) Fixed an issue where EDB synonym names accumulated quote characters across repeated
snapshotandgenerate-changelogcycles, until theDROP SYNONYMstatement Liquibase generated no longer matched the object anddrop-allfailed. Liquibase now reads the synonym name from the EDB catalog as the identifier actually stored there, and preserves the case you specified when it writesCREATE SYNONYMandDROP SYNONYM. This issue was present in Liquibase Secure 5.2.2 and earlier releases. - Changelog Generation and Snapshot(SECURE-560) Fixed an issue where
diffanddiff-changelogdid not detect a renamed primary key constraint on Oracle. Liquibase reported no primary key difference and flagged only the backing indexes, so the generated changelog failed to deploy withORA-02429. Renamed primary keys are now detected on Oracle and on the other case-insensitive databases. This issue was present in Liquibase Secure 5.2.2 and earlier releases. - Changelog Generation and Snapshot(INT-2273)
generate-changelogno longer reportsGenerated changelog written to <path>when it did not actually write anything. When your database contains only the Liquibase tracking tables, the command now prints the same "Changelog not generated" message you already see for a completely empty database, instead of claiming success while creating no file. - Changelog Generation and Snapshot(INT-2097) On Couchbase,
snapshot,diff,diff-changelog,generate-changelog, anddrop-allnow report that the command is not supported instead of failing with an internal error.diffandgenerate-changelogalso exit with a non-zero status when they fail, so a pipeline that gates on the exit code no longer treats the failure as a success. - Changelog Generation and Snapshot(INT-2228) PostgreSQL rollbacks now succeed when a renamed view's column count changed When you used diff-changelog to capture a view column rename that also changed the number of columns in the view, rolling back that change on PostgreSQL could fail with a "cannot drop columns from view" error. Rollback now recreates the view instead of trying to replace it in place when the original definition has fewer columns than the current one, so the rollback completes successfully and restores the original column name and view body. This issue was present in Liquibase Secure 5.2.0.
- Changelog Generation and Snapshot(INT-2229) When
diff-changeloggenerates adropColumnfor a column that a view still uses, it now puts the view update first, so the changelog deploys without you reordering changesets by hand. This issue was present in Liquibase Secure 5.2.0 and later. - Changelog Generation and Snapshot(INT-2251) When you snapshot, diff, or generate a changelog for a CockroachDB schema, Liquibase no longer reports descending-order indexes as unique constraints.
- Changelog Generation and Snapshot(INT-2262) Liquibase now rejects a formatted SQL changeset whose boolean attribute has a value other than
trueorfalse. A changeset such as--changeset alice:1 runAlways:bananafails withERROR [LB-CHG-0017], naming the attribute and the value, and the command exits 1. In Liquibase Secure 5.2.2 and earlier the value was silently treated asfalseand the command succeeded, so a changelog carrying a typo in a boolean attribute has been running without applying the flag you intended. Correct the value totrueorfalseto deploy. This applies to formatted SQL changelogs. YAML and JSON changelogs still accept an invalid boolean and treat it asfalse, and XML has always rejected it. - Changelog Generation and Snapshot(SECURE-330) modifyChangeSets now supports the labels and contexts attributes, so you can apply them in bulk to the changesets in an included changelog. Attribute names are case-insensitive, and this works in every changelog format that supports modifyChangeSets.
- Changelog Generation and Snapshot(SECURE-507) Fixed an issue where generate-changelog could silently drop a standalone index's createIndex statement on PostgreSQL and MySQL when the index shared columns with a UNIQUE constraint. This issue was present in Liquibase Secure 5.0, 5.1, and 5.2.
- Changelog Generation and Snapshot(SECURE-515) When you run
snapshotorgenerate-changelogagainst Microsoft SQL Server with--schemas, Liquibase no longer captures database-level DDL triggers that fall outside the schemas you selected, so the generated changelog no longer fails to deploy on an object that a trigger references outside your filter. This issue was present in Liquibase Secure 5.1.1 and the 5.2 line. - Changelog Generation and Snapshot(SECURE-532)
generate-changelognow preserves index prefix lengths on MySQL and MariaDB, so a changelog generated from a schema with prefix indexes reproduces those indexes instead of dropping the length. Previously the generated changelog failed to deploy with a key-length error onTEXTandBLOBcolumns, and did not reproduce the source index on other column types. Unique prefix indexes are not covered and are still generated without the prefix length. This issue was present in Liquibase Secure 5.1.1 and 5.2.1. - Changelog Generation and Snapshot(SECURE-545) Generating a changelog or snapshot from a MySQL database no longer changes the type of your boolean and time columns. Before this fix, a
TINYINT(1)column you use for a boolean value could come back asTINYINT(3), and aTIMEcolumn with fractional-second precision, likeTIME(6), could lose that precision entirely, which meant redeploying from that changelog could truncate sub-second time values you already had. BothTINYINT(1)andTIME(N)now come through exactly as they appear in your database. This issue was present in Liquibase Secure 5.2.1. - Changelog Generation and Snapshot(SECURE-559) When a primary key constraint is renamed on Oracle,
diff-changelogno longer generates a redundantcreateIndexfor its backing index, so the changelog no longer fails withORA-01408when you runupdate. This matches the existing behavior on PostgreSQL. - Changelog Generation and Snapshot(SECURE-568) Liquibase now consistently rejects an unrecognized database type in your SQL changelog filename, including when you use
--object-changelogsor connect to PostgreSQL, where the check could previously be skipped. This issue was present in Liquibase Secure 5.2.1. - Changelog Generation and Snapshot(SECURE-742) Fixed an issue where
generate-changelogwith--overwrite-output-file=trueemptied an existing output file when the database had no changesets to write, so a changelog you already had became a zero-byte file while the command reported success. This issue is present in every released version up to and including Liquibase Secure 5.2.2. - Changelog Generation and Snapshot(INT-2295)
generate-changeloganddiff-changelogno longer fail withUnknown boolean valuewhen a PostgreSQL table has abooleangenerated column. Previously a single such column caused the command to abort without producing a changelog. This issue has been present since PostgreSQL generated column support was added. - Changelog Generation and Snapshot(SECURE-211) Fixed an issue where Liquibase could compute an incorrect checksum for a
dbms-scoped<sqlFile>change (for example,<sqlFile dbms="mssql" .../>) when the checksum was calculated before the target database was known in scope, such as underliquibase flow. The affected changeset's checksum resolved to the hash of an empty string, which could causerunOnChangechangesets to silently stop detecting further script edits, with no warning or error. Note: If a changeset was affected by this issue before upgrading, Liquibase automatically corrects the stored checksum the next time you runupdate. ForrunOnChangechangesets, this correction happens by re-running the changeset one additional time. If the changeset's SQL is not idempotent (for example, a plainINSERTrather thanMERGEorINSERT ... WHERE NOT EXISTS), this can insert one duplicate row. Idempotent SQL is unaffected. - Changelog Generation and Snapshot(SECURE-417)
diffanddiff-changelognow warn on the console, with the detail written to the log file, when--excludeObjectsleaves behind objects that depend on something you excluded, such as a foreign key, a unique constraint, or the index backing it, so you find out before the generated changelog fails to deploy. This issue was present in Liquibase Secure 5.2.1 and earlier. - Changelog Generation and Snapshot(SECURE-550)
generate-changelogno longer writesdefaultValue="null"for a nullable MySQL or MariaDBENUMcolumn that has no default, so the generated changelog deploys instead of failing on MariaDB withInvalid default value. This issue was present in Liquibase Secure 5.2.1 and earlier. - Changelog Generation and Snapshot(SECURE-557)
generate-changelogcan now pretty-print the SQL it writes to SQL-format changelogs so long statements are readable and diff cleanly, which you turn on withliquibase.changelog.prettyPrintSqlbecause it is off by default in this release. - Changelog Generation and Snapshot(SECURE-785)
generate-changelogon SQL Server now quotes column default values, so a changelog it generates for a default such as' 'or'A'runs without a syntax error when you deploy it. This issue was present in Liquibase Secure 5.2.2. - Changelog Generation and Snapshot(SECURE-791)
update-sqland other*-sqlcommands now keep a trailing comment at the end of a formatted-SQL changeset in the generated output whenstripCommentsisfalse, instead of silently dropping it. - Changelog Generation and Snapshot(INT-2341)
generate-changeloganddiff-changelogno longer capture the system-managedio.unitycatalog.tableIdtable property on Databricks Unity Catalog. Databricks rejects that property when a user sets it, so a generated changelog containing it could not be deployed. - Database Support(INT-2053) Liquibase now supports PostgreSQL 18 VIRTUAL generated columns end to end. You can model VIRTUAL columns in your changelogs and deploy them, and
snapshot,generate-changelog, anddiffnow preserve whether a generated column is VIRTUAL or STORED. Previously, round-tripping a PostgreSQL 18 schema silently re-shaped VIRTUAL columns as STORED. - Database Support(INT-1550) You can now use the
set-labelsandset-contextscommands with Formatted Mongo changelogs, so you can manage labels and contexts on MongoDB the same way you do with Formatted SQL changelogs. - Database Support(INT-2038)
createDynamoTablenow validatesattributeDefinitionsand tags up front in YAML and JSON changelogs, rejecting malformed structure before it reaches AWS instead of silently dropping tags.nonKeyAttributesprojections now use a wrappednonKeyAttributesyntax, fixing a bug where multiple entries collapsed to just the last one. - Database Support(INT-1961) Fixed an issue where
dropAllfailed with aNamespaceNotFounderror on MongoDB 6 when the database contained views. MongoDB 7 and later were not affected. - Database Support(INT-2032) Fixed an issue where update could fail on BigQuery while creating the DATABASECHANGELOGLOCK table. BigQuery applies DDL with eventual consistency, so on large projects the table was not yet visible to the query engine when Liquibase checked it, and the run failed after several minutes of retries. Liquibase now waits for the new table to become queryable before continuing.
- Database Support(INT-2098) You can now run consecutive changesets that create or delete a global secondary index on the same DynamoDB table, because Liquibase's waiter now waits for the index operation itself to finish instead of returning as soon as the table is active.
- Database Support(INT-2263) On Couchbase, Liquibase now creates a secondary index on
meta().idfor the tracking collections, namedliquibase_DATABASECHANGELOG_idxandliquibase_CHANGELOGLOCKS_idx, and no longer creates a primary index. An existing primary index is left in place, so an upgraded deployment keeps using it until you drop it once. After that Liquibase does not recreate it. Two consequences are worth planning for. Custom queries, scripts, and dashboards that read these collections should filter on the index key, for exampleWHERE meta().id IS NOT MISSING, because a query with noWHEREclause is no longer served by any index. On Couchbase 7.2 and earlier such a query fails, and on 7.6 and later it falls back to a sequential scan. And running an older version of Liquibase against the same database recreates a primary index on both collections, which Liquibase 6.0 then leaves in place, so a single run of an older version restores the primary index without reporting it. - Database Support(SECURE-664) Liquibase now preserves the case of your BigQuery project ID. In Liquibase Secure 5.2.0 through 5.2.2, Liquibase lowercased the project ID when it recorded the connection, so a connection to
ProjectId=MyProjectwas recorded asmyproject. If you have tooling that reads the recorded connection and treats the project ID as case-sensitive, it sees the correct value again after you upgrade. - Database Support(INT-2293) On Couchbase, a change that removes documents by ID no longer modifies the set of IDs you supplied, so the same change is safe to run again and passing an immutable set of IDs no longer fails with a confusing transaction error.
- Database Support(SECURE-724) Liquibase Secure now bundles Oracle's
ojdbc17JDBC driver in place ofojdbc8, which Oracle recommends for Java 17 and later and which implements the standard JDBC 4.3 interfaces rather than Oracle's own extension classes. - Database Support(INT-2346)
snapshot,generate-changelog, anddrop-allno longer fail on Cassandra with aSQLRecoverableExceptionabout a closed result set. Foreign-key metadata, which Cassandra has none of, is no longer requested from the driver. - Database Support(INT-2031) Fixed an issue where deploying to AWS Keyspaces repeatedly dropped and recreated the
DATABASECHANGELOGLOCKtable duringupdateandrollback, making deployments take significantly longer than they should. - Logging and Reports(SECURE-40) Fixed an issue where the Liquibase Maven plugin did not apply
--log-levelor--log-formatunless the license key was set as an environment variable. All configuration methods (pom.xml, JVM system properties, environment variables, and the properties file) now apply structured logging correctly. - Logging and Reports(SECURE-486) Fixed the Maven plugin to recognize unprefixed
logFormat,logLevel,logFile, and license key settings in aliquibase.propertiesdefaults file, so structured logging and license detection work the same way they do via CLI arguments, pom configuration, and environment variables. - Logging and Reports(SECURE-52) Liquibase now correctly applies the log level you set in a Flow file's
globalVariablessection to all per-action log files, so you get the expected detail without repeating the setting in each action. - Logging and Reports(SECURE-50) Liquibase now writes
validatecommand output to the--output-fileyou specify, so validation results and errors are available for CI/CD pipelines and other automated workflows. - Logging and Reports(SECURE-66) The embedded Python runtime moves from 3.11 to 3.12 (GraalPy 25.0.2). If you point
liquibase.script.python.executablePathat your own virtual environment, recreate it against Python 3.12 before running policy checks, or they will fail withModuleNotFoundError. If you use only the built-in checks or the embedded virtual filesystem, no action is needed. - Logging and Reports(SECURE-649) Liquibase Secure no longer strips comments from your SQL by default. Comments in formatted SQL changesets,
sqlandsqlFilechanges, and stored procedure bodies now reach the database as written, where in Liquibase Secure 5.2.2 and earlier they were removed unless you opted out. Community Liquibase is unchanged and still strips comments by default. To restore the previous behavior everywhere, setglobal-strip-commentstotrue, or setstripCommentson an individual changeset. - Logging and Reports(SECURE-459) Structured JSON logs now carry an
errorClassificationfield alongside the existingliquibaseErrorCode, so you can tell a business failure from a system failure without parsing message text. Both values are stable and locale-independent, which makes them safe to match on in CI pipelines and alerting rules. - Logging and Reports(INT-2249) Liquibase 6.0 removes three Db2 for z/OS properties:
liquibase.db2z.trackingTables.location.tablespace,liquibase.db2z.databasechangelog.index, andliquibase.db2z.databasechangeloglock.index. If you set any of them, remove them from your configuration. Db2 for z/OS now creates the tracking tables' tablespace and their primary-key index itself, and you can still name the database withliquibase.db2z.trackingTables.location.database. A removed property left in a defaults file is ignored, but it is rejected as a CLI flag and fails at startup understrict=true. - Logging and Reports(NTT-1333) The license tracking utility that shipped inside Liquibase Secure is no longer included as of Secure 6.0.
- Logging and Reports(SECURE-463) If you embed Liquibase Secure in your own application (for example, Spring Boot), running a Liquibase command no longer changes your application's own logging levels or handlers, because Liquibase Secure's logging now runs through SLF4J instead of configuring Java's built in logging directly.
- Logging and Reports(SECURE-536) Liquibase now always prints all four
UPDATE SUMMARYlines, includingFailed deployment: 0, when you rerunupdateagainst a changelog where every change set is already deployed. This issue was present in every Liquibase Secure 5.x release, and in 4.x releases back to at least 4.25.0. - Logging and Reports(SECURE-616) Liquibase 6.0 defines an exit-code contract for the Liquibase CLI. Exit code 0 still means success, and the exit code for a failure now depends on how that failure is classified rather than always being 1. If your scripts or CI/CD pipelines check the exit code, treat any nonzero value as a failure rather than testing for code 1 specifically. If your pipeline branches on exit code 1 to mean "any Liquibase failure", update it to fail on any nonzero code. This applies to the Liquibase CLI. The Maven and Spring integrations fail by throwing and do not consult the exit map.
- Logging and Reports(SECURE-668) When a database connection fails, Liquibase no longer prints your password in the error message. If your JDBC URL carries credentials in the authority form (jdbc:postgresql://user:password@host:port/database), a failed connection used to echo the driver's error text as it was, so your username and password appeared in cleartext on the console, in your --log-file (both text and JSON output), and in Maven plugin output, for both url and referenceUrl. Liquibase now removes credentials from exception messages before they reach any of those places. Passwords you supply with --password, with an environment variable, or as query parameters in the URL (?user=&password=) were never affected. If you have used the authority form, check any log files you have kept and rotate the credentials that appeared in them. This issue was present in Liquibase Secure 5.2.1.
- Logging and Reports(SECURE-677) You can now use lowercase
log-levelvalues (for examplefine) in a flow file'sglobalArgs, matching the behavior of the--log-levelCLI flag and theliquibase.logLevelproperties file setting. An unrecognized value now falls back toINFOwith a warning instead of stopping the flow with a raw exception. - Logging and Reports(SECURE-695) Fixed an issue where
rollback-one-changesetandrollback-one-updateprinted the same failure warning twice, once in the console output and once in the generated HTML report, when the targeted changeset could not be located. This issue was present in Liquibase Secure 5.2.2. - Logging and Reports(SECURE-713) Fixed an issue where the Maven plugin's
dbcl-historyand flow goals left their output file open after the goal finished, which could exhaust file handles during a long Maven build that invokes them repeatedly. This issue was present in Liquibase Secure 5.2.0, 5.2.1, and 5.2.2. - Logging and Reports(SECURE-732) Fixed an issue where the last line written to a log file or output file on Azure Blob Storage was silently missing. When --log-file or --output-file targeted an az:// location, the blob was created and correctly populated except for its final line, usually the command-completion message, and no error or warning appeared anywhere. The full content is now written, and a failure to write reports an error instead of being discarded.
- Logging and Reports(SECURE-460) As of Liquibase 6.0, the CLI writes command results (SQL, JSON, diff output, and the text results of look-up commands) to STDOUT, and everything else, including the banner, progress messages, success confirmations, warnings, and errors, goes to STDERR. You're affected if your scripts or CI pipeline capture STDOUT from
update,rollback, ordbDoc, since those commands have no machine-readable result and now write everything to STDERR instead. The look-up commandsstatus,history, andchecks runkeep their results on STDOUT. You're not affected if you only capture the structured output of commands likeupdate-sql,snapshot, ordiff(that was already on STDOUT), or if you don't parse Liquibase's output streams at all. If you need time to update your scripts, setliquibase.legacyStreamRouting(or theLIQUIBASE_LEGACY_STREAM_ROUTINGenvironment variable, or the--legacy-stream-routingflag) to restore the combined pre-6.0 stream behavior. This compatibility option is deprecated and will be removed in Liquibase 6.2. - Logging and Reports(SECURE-462) Command output is now cleaner and keeps your credentials out of view. Benign command failures no longer print a full stack trace by default. You'll only see one when you run with
--log-level=FINE. You can also see how many rows each statement affected without turning on full SQL logging. Set the new--show-rows-affected=trueflag and commands likeupdateprint a line such as "3 row(s) affected" after each insert, update, or delete. The flag is off by default, so your existing output is unchanged unless you opt in, and it works independently of--sql-log-level. If you use the Maven plugin with verbose output (-eor-X), your database credentials no longer appear in the JDBC URLs it prints. - Logging and Reports(SECURE-461) You can now control how much detail Liquibase prints during a command with the new
--verbosityflag (quiet,normal, orverbose), plus a--quietshortcut. Choosequietto strip the banner, license line, changeset headers, and other narration from your output, without losing the results themselves. For example,update-sql --quietstill prints the SQL. Chooseverboseto add fine-grained diagnostic detail, including stack traces, when you're troubleshooting. Thenormaltier, which is the default, looks and behaves exactly like today's output, so upgrading doesn't change what you see unless you ask it to. If you already set--log-levelexplicitly, that choice still wins over whatever verbosity implies. - Logging and Reports(INT-2268) When
update,update-to-tag, orupdate-one-changesetfails with an error Liquibase does not recognize, such as an error raised by a database driver, you now see the original error instead of aClassCastException, androllbackOnErrorruns as expected. - Logging and Reports(SECURE-289)
status --verbosenow takes an optional comma-separated list of the changeset attributes you want to see, such asstatus --verbose=labels,teams,runwith,runonchange, and a newstatus --simpleflag suppresses the per-changeset line so you see only the count of pending changesets. - Logging and Reports(SECURE-596)
drop-allnow fails with a clear error when you point it at an offline database URL, instead of permanently deleting the file named in that URL'schangeLogFileparameter. This issue was present in Liquibase Secure 5.2.1 and earlier. - Logging and Reports(SECURE-792) Setting the
LIQUIBASE_LOG_LEVELenvironment variable now lowers the Maven console log level, soLIQUIBASE_LOG_LEVEL=ERRORkeepsINFOlines out of your Maven build output. - Logging and Reports(SECURE-885) JDBC driver warnings, such as SQL Server's "Changed database context" message on every
USEstatement, go to the log again instead of the console, solog-levelcontrols whether you see them. Since Liquibase Secure 5.0.0 they printed on every run whatever your log level, and printed a second time as a mirrored log line whenever a log level was set. This issue was present in Liquibase Secure 5.0-5.2. - Logging and Reports(SECURE-793) A defaults-file key scoped to another command, such as
liquibase.command.checks.run.autoUpdate, no longer produces aPotentially ignored key(s)warning when you run a different command, and no longer fails the run at startup when you also setstrict=true. This issue was present in Liquibase Secure 5.2.2 and earlier. - Logging and Reports(SECURE-741) On Windows running Liquibase Secure under Java 17, the
--log-filewas written using the JVM's default platform charset (Cp1252) while console output was correctly encoded as UTF-8. Non-ASCII changeset authors, remarks, and other changelog text that displayed correctly on the console was corrupted in the log file. In a plaintext log, any character outside Cp1252, including CJK and Cyrillic text, was replaced with?and cannot be recovered. In a JSON log (--log-format=JSON), the same text was double-encoded into mojibake that most log consumers cannot repair. Java 18 and later were not affected. Liquibase now pins the log file encoder to UTF-8 independently of the JVM's default charset, matching the console. If you ran Liquibase Secure on Windows with Java 17 and kept log files containing non-ASCII changeset authors or remarks, check them for corruption. Any plaintext log showing?in place of that text has lost the original characters permanently. - Logging and Reports(SECURE-750) When you ran an update with
--show-summary-output=LOGand did not also set--output-file, theUPDATE SUMMARYwas printed toSTDOUTin addition to the log file, even thoughSTDOUTwas not the requested destination. This could interfere with scripts or tooling that parseSTDOUToutput. Liquibase now writes the summary only to the log file in this case, leavingSTDOUTclean. The summary still reaches--output-filewhen you set one, and--show-summary-output=CONSOLEandALLare unaffected. - Logging and Reports(SECURE-752) When Liquibase could not open the file given to
--log-fileand fell back to console logging, the warning message included that file path exactly as supplied. If the path contained a carriage return or line feed character, it could inject additional, fabricated lines into the log output. Liquibase now strips carriage returns and line feeds from the--log-filepath before including it in this fallback warning message. - Logging and Reports(SECURE-824, SECURE-836) With
rollback-on-errorset, Liquibase now runs a failed changeset's own<rollback>only when that changeset could have committed part of its work before failing, which coversrunWith,runInTransaction="false", and Oracle, where every DDL statement commits on its own. A failure inside an intact transaction leaves the database as it was, so Liquibase reports that no deployed changesets were found to roll back instead of running a rollback against objects that were never created and warning that manual intervention is required. This issue was present in Liquibase Secure 5.2.1 and 5.2.2. - Logging and Reports(SECURE-803) A failing
validatenow writes its list of validation errors to STDOUT as the command's result, withERROR [LB-CHG-0035] Changelog validation failedand a non-zero exit code on STDERR. In Liquibase Secure 5.0-5.2 the error list went to STDERR only, so a script capturing STDOUT got nothing. - Logging and Reports(SECURE-887) The
totalSkippedvalue in structured logs now includes changesets skipped because of preconditions, an operating system mismatch, or licensing, so it agrees with the individual skip counts reported beside it. The update summary detail table also reaches--output-filewhen--show-summary-outputisLOG, as it already did forCONSOLE. Automation that readstotalSkippedwill see higher numbers than before. - Logging and Reports(SECURE-888) Changesets that failed to deploy are no longer counted as skipped in the structured log's update summary. Automation that reads the skipped counts will see lower numbers than before, because entries for failed and exception-skipped changesets are no longer included.