Skip to content
Snippets Groups Projects
Name Last commit Last update
..
others/db_changes/readme.adoc

liquibase-readme

TODO: update to new Structure

Structure within ADITO

in theory

When using liquibase in an ADITO-System, your project structure should look like this:

PROJECTHOME/others/db_changes/masterChangelog.xml
PROJECTHOME/others/db_changes/struct/
PROJECTHOME/others/db_changes/data/
PROJECTHOME/others/db_changes/misc/
PROJECTHOME/others/db_changes/liquibase.properties

The file masterChangelog.xml contains a list of all changes (well, in fact more like a list of all changelog-files). The structure could look like this:

<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
    <include file="struct/create_org.xml"/>
    <include file="data/example_org.xml"/>
</databaseChangeLog>
Keep in mind that the header-information can change, visit therefore the liquibase-website: http://www.liquibase.org Specific: the XML-format definition: http://www.liquibase.org/documentation/xml_format.html

So, that’s where all our changes are located - but what about the changes itself? As you can think of, they’re stored in files located in the folders struct for DDL-stuff like create, alter etc. and data for DML-stuff like insert, update etc.

If you want to know what to do add in these files take a look at the official liquibase documentation for further information how to fill these XML files: http://www.liquibase.org/documentation/index.html

Always remember that you might have to define some rollback-entries.
This is e.g. not needed for create-entries but for others like insert.

So, whats about that liquibase.properties file? The file is needed to specify some data here, e.g. the driver-name, classpath (of the driver), jdbc-url, etc. You want to store these information there because otherwise you’d need to specify them on every call of liquibase. Not cool.

Now you’re ready to run commands like liquibase update in the PROJECTHOME/others/db_changes folder.

in practice

Let’s say we want to add a new table FOOBAR with some demo-data. We need to:
  • create a new file in the struct-folder; e.g. create_FOOBAR.xml

  • fill the file with changesets that will create a table

  • add include-tag in the masterChangelog.xml for the created file

  • create a new file in the data-foler; e.g. demoData_FOOBAR.xml

  • fill the file with changesets that will insert data into the table and define rollback-entries

  • add include-tag in the masterChangelog.xml for the created file

  • to apply the changes simply run liquibase update

For example one feature package "add contact management" could contain several files itself:

 create_org.xml
 create_pers.xml
 create_relation.xml

On the other hand, several feature packages cannot be contained in one changelog-file.

How to use it

Normally everything you need is provided by the project-template and the existing files in the git-repository. Therefore it’s easy to use and you can start immediately.

Keep in mind:
  • run liquibase update to apply possible changes after merging something into your repository

  • apply modifications on the database always with liquibase; do not write a create-script in SQL. Write some changesets and execute them

  • set correct author- and id-attributes in your changelog-files

FAQ

  1. What about unicode-columns like NVARCHAR or NCLOB?

    Simply define them in your changesets. They are prefered over non-unicode-datatypes

  2. What if i switch between branches and want to switch between different database-states?

    This is something that needs to be defined. Possible ways: rollback or recreate your database entirely

  3. Is it possible to write an update-changeset where I can use a preparedStatement in the where-clause?

    This needs to be analyzed and (the result) added here.


have a nice day :-)