Skip to main content

Change Types

Last updated on

A Liquibase-compatible schema is composed of one or more Change Types. These are a structured instruction that defines particular database updates. Each changeset you write in YAML, XML, JSON, or SQL contains one or more change types. When Applying the change, Database DevOps translates these into the correct SQL statements for the target database platform.

Why Change Types Matter

  • Cross-Database Compatibility: You write a single change definition; Liquibase generates SQL for MySQL, PostgreSQL, Oracle, SQL Server, and more.
  • Clarity & Safety: Change types are declarative and easier to understand than raw SQL. They also help avoid mistakes with rollbacks.
  • Governance & Review: Each changeset with a defined change type can be tracked, versioned, and peer-reviewed like application code.
  • Automation-Friendly: Change types integrate smoothly into CI/CD pipelines, making database deployments repeatable and reliable.

Categories of Change Types

Harness Database DevOps supports a wide range of change types for managing schema and data evolution. The change types are grouped by Entity, Constraint, Data, Programmability, and Utility, along with their rollback behavior and examples.

1. Create Table Creates a new table with defined columns. By default, when rolled back the table is dropped.

- changeType: createTable
tableName: users
columns:
- name: id
type: int
constraints:
primaryKey: true
- name: name
type: varchar(255)
  1. Drop Table Removes an existing table. This change type has no automatic rollback; write a manual rollback block with a createTable statement if you need to restore the table.
- changeType: dropTable
tableName: users
  1. Add Column Adds new columns to a table. By default when rolled back, drops the added columns.
- changeType: addColumn
tableName: users
columns:
- name: email
type: varchar(255)
  1. Drop Column Removes a column from a table. This change type has no automatic rollback; write a manual rollback block with an addColumn statement if you need to restore the column.
- changeType: dropColumn
tableName: users
columnName: email
  1. Rename Column Renames a column in a table. When rolled back, renames it back.
- changeType: renameColumn
tableName: users
oldColumnName: email
newColumnName: user_email
note

Renaming a column directly typically necessitates downtime because it means the database schema is not backwards compatible. For this reason, Harness recommends adding a new column using the new name, and setting up a trigger to sync the two versions. Once the old application version no longer exists in any environment, an additional changeset can be released that removes the trigger and deletes the old column.

  1. Rename Table Renames a table. When rolled back, renames it back.
- changeType: renameTable
oldTableName: users
newTableName: app_users
note

Renaming a table directly typically necessitates downtime because it means the database schema is not backwards compatible. For this reason, Harness recommends adding a new table using the new name, and setting up a trigger to sync the two versions. Once the old application version no longer exists in any environment, an additional changeset can be released that removes the trigger and deletes the old table.

  1. Create Index Creates an index to improve query performance. When rolled back, the index is dropped.
- changeType: createIndex
tableName: users
indexName: idx_users_email
columns:
- name: email
  1. Drop Index Removes an existing index. This change type has no automatic rollback; write a manual rollback block with a createIndex statement if you need to restore the index.
- changeType: dropIndex
tableName: users
indexName: idx_users_email
  1. Modify Data Type Changes the data type of an existing column. This change type has no automatic rollback; write a manual rollback block if you need to revert to the original type.
- changeType: modifyDataType
tableName: users
columnName: age
newDataType: bigint
warning

Depending on the database engine and table size, modifying a column’s data type may acquire locks or trigger a table rewrite. Consider phased rollouts for large production tables.

  1. Add Auto Increment Configures an existing column as auto-incrementing so the database generates a new value on each insert. This change type has no automatic rollback; write a manual rollback block if you need to reverse it.
- changeType: addAutoIncrement
tableName: users
columnName: id
columnDataType: int
  1. Add Lookup Table Creates a new lookup table populated with the distinct values from a source column, then adds a foreign key on the source table pointing to the new lookup table. The source column is not dropped. When rolled back, the lookup table and foreign key are removed.
- changeType: addLookupTable
existingTableName: employees
existingColumnName: department
newTableName: departments
newColumnName: name
newColumnDataType: varchar(255)
constraintName: fk_employees_departments
  1. Merge Columns Concatenates the values of two existing columns into a new combined column, then drops both source columns. This change type has no automatic rollback, so back up the source data before you run it.
- changeType: mergeColumns
tableName: users
column1Name: first_name
joinString: " "
column2Name: last_name
finalColumnName: full_name
finalColumnType: varchar(255)
  1. Set Column Remarks Adds a descriptive comment to a column, stored in the database catalog. This change type has no automatic rollback; write a manual rollback block if you need to clear the remark.
- changeType: setColumnRemarks
tableName: users
columnName: email
remarks: Primary contact email address for the account
  1. Set Table Remarks Adds a descriptive comment to a table, stored in the database catalog. This change type has no automatic rollback; write a manual rollback block if you need to clear the remark.
- changeType: setTableRemarks
tableName: users
remarks: Stores all registered application users

Change Types vs Raw SQL

The table below compares the advantages of using change types versus writing raw SQL for database changes:

AspectChange TypesRaw SQL
PortabilityWorks across multiple databases (Liquibase translates automatically)Vendor-specific, different SQL databases have minor SQL syntax differences that may cause failure on different platforms.
ReadabilityDeclarative and self-explanatoryRequires SQL expertise to interpret
RollbackBuilt-in rollback support for most change typesMust be manually written and tested
GovernanceEasier to version, review, and auditHarder to maintain compliance and history
FlexibilityCovers most schema, data, and constraint changesNeeded for complex, vendor-specific features

Always prefer Change Types for common operations; fall back to raw SQL only when absolutely necessary.

Conclusion

Change types are the building blocks of database changes in Harness Database DevOps. They provide a clear, portable, and automation-friendly way to manage schema and data evolution across diverse database platforms. By leveraging change types, teams can ensure safer deployments, easier rollbacks, and better collaboration in their database development workflows. For complex scenarios not covered by change types, raw SQL can be used, but it should be minimized to maintain the benefits of using change types.

Next steps

Now that you understand change types, you can start authoring and deploying database changes with Harness Database DevOps.