CreateTableMustHavePrimaryKey

CreateTableMustHavePrimaryKey is a custom policy check that requires every CREATE TABLE statement to also have a PRIMARY KEY. All Regex Custom Policy Checks can only run against the changelog, not against the database.

regex: (?is)(?=.*\b(create)\b)(?=.*\b(table)\b)(?!.*\b(primary)\b)(?!.*\b(key)\b).*

This example utilizes Cassandra. You can use this check as it is or customize it further to fit your needs in your NoSQL database.

Scope Database
changelog Cassandra

Step-by-Step

Note: These steps describe how to create the custom policy check. It does not exist by default in Liquibase Pro.

  1. Enter this command into the CLI: 
    liquibase checks customize --check-name=SqlUserDefinedPatternCheck
  2. Give your check a short name for easier identification. In this example we will title the check:
    CreateTableMustHavePrimaryKey
  3. Set the Severity to return a code of 0-4 when triggered.
    Options: 'INFO'=0, 'MINOR'=1, 'MAJOR'=2, 'CRITICAL'=3, 'BLOCKER'=4

  4. Set the SEARCH_STRING to this valid regular expression:
    (?is)(?=.*\b(create)\b)(?=.*\b(table)\b)(?!.*\b(primary)\b)(?!.*\b(key)\b).*

  5. Set the MESSAGE for when a match for regular expression <SEARCH_STRING> is found in a Changeset:

    Example: Error! CREATE TABLE statement must have a primary key included.

  6. Set STRIP_COMMENTS to true if you want to remove the comments from the output.

    The regex custom policy check is created successfully.

Sample Passing Script

Copy
--changeset amalik:employee
CREATE TABLE EMPLOYEE (
   EMPLOYEE_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY    CONSTRAINT PEOPLE_PK PRIMARY KEY, 
   FIRST_NAME VARCHAR(26),
   LAST_NAME VARCHAR(26)
);

--changeset amalik:company
CREATE TABLE COMPANY (
   COMPANY_ID INT NOT NULL, 
   BOOKING_DATE DATE NOT NULL,
    ROOMS_TAKEN INT DEFAULT 0
   PRIMARY KEY (COMPANY_ID, BOOKING_DATE)
);

Sample Failing Scripts

Copy
--changeset amalik:employee
CREATE TABLE EMPLOYEE (
   EMPLOYEE_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY    CONSTRAINT PEOPLE_PK, 
   FIRST_NAME VARCHAR(26),
   LAST_NAME VARCHAR(26)
);

--changeset amalik:company
CREATE TABLE COMPANY (
   COMPANY_ID INT NOT NULL, 
   BOOKING_DATE DATE NOT NULL,
    ROOMS_TAKEN INT DEFAULT 0
;

Sample Error Message

Copy
CHANGELOG CHECKS
----------------
Checks completed validation of the changelog and found the following issues:

Check Name:         Check for specific patterns in sql (CreateTableMustHavePrimaryKey)
Changeset ID:       employee
Changeset Filepath: changeLogs/1_tables/01_createTable1.sql
Check Severity:     INFO (Return code: 0)
Message:            Error! CREATE TABLE statement must have a primary key
                    included.