March 10, 2023

Two Approaches to Database Version Control: State-based vs. Migration-based

Keeping up with dynamic business demands is a significant challenge for modern databases. The most crucial requirement is to ensure regular updating of the database while preserving all of its data. A well-planned approach to database development and deployment via state-based or migration-based techniques can provide a solution. However, it’s essential to thoroughly understand both approaches to determine which is best for your specific needs.

The Importance of Treating Database Updating as a Distinct Challenge

Managing databases requires a constant awareness of the two distinct elements that make up a database: the data it stores and the structure used to organize that data. Updating a database requires careful consideration of several factors.

A database consists of the table structure, code in stored procedures, the data stored in those tables, and the interrelations between the database objects. This presents more complex challenges when implementing changes. Synchronization is also crucial, especially when multiple developers work on the same object within the database. It’s essential to preserve all business data and the entire database code and to ensure that data remains secure after updates.

Unlike application code, the database cannot be updated by simply deleting and replacing the old version with a new one. Fortunately, there are already tested and approved methods available to address these challenges: state-based and migration-based database delivery models. As a database developer, you will likely use both methods depending on the needs of your project.

Understanding State-based Database Deployment

In state-based database deployment, the database schema is stored in an ideal end state in the code repository. This approach was popularized by Microsoft and implemented in its Visual Studio solution.

The idea behind state-based deployment is straightforward: a snapshot of the ideal database structure is kept, and the actual database project is worked on to match this ideal. All database objects such as tables, views, stored procedures, functions, triggers, and others are stored as state-based scripts in separate SQL files in their final form.

When database developers need to update the database schema, they deploy it on the local server and make the necessary changes. The compare tool then generates scripts to synchronize the actual database with the ideal database. Finally, the version control system uploads these changes to the server.

Changes in state-based database delivery are implemented sequentially, from lower to higher environments, such as from Development to Testing, and then to Production.

State-based database delivery has several advantages, including the ability to store the database schema in Source Control for easy monitoring of the database state, detecting compile-time errors in SQL files immediately, and avoiding the need to create multiple scripts for the same entity. Additionally, all changes deployed to the database can be monitored and managed easily, and dedicated tools can automatically generate and execute ALTER scripts.

However, the state-based approach also has some disadvantages, such as the need to generate a new script for every new environment and the inability to revert changes automatically, which can cause issues for automated processes.

The state-based approach is the default choice for new project development, from the beginning stages until the final step of releasing the application to the Production area.

Understanding Migration-based Database Deployment

Migration-based database deployment works differently than the state-based approach. Rather than having a single snapshot of an ideal database, migration-based deployment uses a collection of migration scripts that transfer the actual database from one version to another.

Each migration script is created with a specialized DDL statement and an incremental version number, and all migration scripts are stored in the repository. To update a database, the migration scripts must be executed in the correct order.

The migration-based approach is commonly used for database testing, updating databases with new features and enhancements, or creating a database from scripts used in the state-based approach. Many developers prefer the migration-based approach because it allows for faster task completion and quicker script deployment. However, creating migration scripts manually can be time-consuming.

The advantages of migration-based deployment include the ability to change both the database schema and data simultaneously, better alignment with DevOps best practices, executing the same code in all environments, better feature testing and control, and the ability to write migration scripts in programming languages other than SQL.

However, the migration-based approach also has some disadvantages, including the need for developers to write all migration code manually, risks of code being overridden by other developers’ changes in case of synchronization failures, and inefficiency when working with stored procedures and functions.

Overall, the migration-based approach is typically used for existing databases that require updates and enhancements over time, with changes being delivered through migration scripts.

Comparing State-based and Migration-based Database Deployment

The main difference between state-based and migration-based database deployment is the source of truth: the ideal database or the scripts used to upgrade the database. The choice between these approaches depends on the specific project requirements and considerations.

Some developers prefer the state-based approach for its reliable testing and immutability, while others opt for the migration-based approach for its suitability to deployment challenges. However, writing upgrade scripts manually can be a complicated and time-consuming task.

State-based deployment can use computer-generated upgrade scripts 95% of the time, while migration-based deployment requires custom directions for most cases. Additionally, state-based delivery can make it easier for teams to work on complicated databases with sophisticated dependencies.

See the comparison table below for other key differences between these two approaches:

Database developers usually need to use both state-based and migration-based approaches. State-based is good for evolving systems during the early stages of a project, while migration-based is better for launched systems that require updates and enhancements. State-based is ideal for new projects or maintaining systems with infrequent changes, while migration-based provides better control over changes and collaboration opportunities. The choice depends on project requirements and developers should be proficient in both approaches.

Updating the database using Devart dbForge SQL Tools

Devart provides a range of dedicated tools to help developers perform various tasks related to databases, including database change management. Using specialized tools is crucial to automate and simplify the updating of databases, as the number of releases and updates increases.

Devart’s Source Control for SQL Server, a popular add-in for SSMS, is a valuable component in DevOps automation that provides database version control functionality to SQL Server developers. This tool operates in the state-based mode and allows users to easily track and compare changes, synchronize database versions, and roll back changes if needed. It also provides many other useful options.

If your project requires migration-based delivery, Devart’s Schema Compare for SQL Server is another tool that can help. It allows developers to compare and synchronize database schemas between different SQL Server databases and scripts. This tool can generate upgrade scripts, eliminating the need to write migration scripts manually.

Regardless of your database delivery model, automating routine tasks can save you time and effort. Fortunately, Devart’s dbForge SQL Tools are available to provide you with all the necessary functionality to automate database-related tasks. Whether you need to perform state-based or migration-based delivery, Devart’s tools can help you automate tasks such as version control, schema comparison, and synchronization, enabling you to streamline the database updating process and work more efficiently.


In conclusion, both state-based and migration-based approaches are essential for database deployment, and their selection depends on the specific project requirements. While state-based is suitable for new project development, migration-based is preferable for existing database updates and enhancements.

Regardless of the approach, automating routine tasks with specialized tools such as dbForge SQL Tools can save time and effort for database developers. These tools provide the necessary functionality for database change management, version control, schema comparison, and synchronization.

With a fully-functional free trial of dbForge SQL Tools, developers can evaluate the powers of the tools and select the most appropriate one for their database deployment needs.

About the author 

Peter Hatch

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}