TablesMustHavePkOrBeNamedNpk
Last updated: January 22, 2026
TablesMustHavePkOrBeNamedNpk is a custom policy check that finds tables that have a Primary Key AND contain NPK in their name.
Before you begin
Scope | Database |
changelog | Relational |
Liquibase 4.29.0+
Ensure the Liquibase Checks extension is installed. In Liquibase 4.31.0+, it is already installed in the
/liquibase/internal/libdirectory, so no action is needed.If the checks JAR is not installed, download liquibase-checks-<version>.jar and put it in the
liquibase/libdirectory.(Maven users only) Add the
liquibase-checksdependency to yourpom.xmlfile. See Add extensions with Maven for more information.Java Development Kit 17+ (available for Open JDK and Oracle JDK)
Linux, macOS, or Windows operating system
Procedure
These steps describe how to create the Custom Policy Check. It does not exist by default in Liquibase Secure.
Run this command in the CLI:
Give your check a short name for easy identification
Use up to 64 alpha-numeric characters only.
Set the Severity to return a code of 0-4 when triggered.
These severity codes allow you to determine if the job moves forward or stops when this check triggers.
Learn more here: Use Policy Checks in Automation: Severity and Exit Code
options: 'INFO'=0, 'MINOR'=1, 'MAJOR'=2, 'CRITICAL'=3, 'BLOCKER'=4
Set 'OPERATOR' (options: STARTS_WITH, ENDS_WITH, CONTAINS, REGEXP, EQUALS) [STARTS_WITH]:
Set the SEARCH_STRING to this valid regular expression:
In this example we will use:
TablesMustHavePkOrBeNamedNpk
Set 'CASE_SENSITIVE' to true or false depending on how narrow you want your search to be.
In this example, we will set it to false.
Enter this command into the CLI:
Give your check a short name for easier identification
Use up to 64 alpha-numeric characters only.
[ConstraintMustExist1]:
TablesMustHavePK
Set the Severity to return a code of 0-4 when triggered.
Options: 'INFO'=0, 'MINOR'=1, 'MAJOR'=2, 'CRITICAL'=3, 'BLOCKER'=4
Set the CONSTRAINT_OPERATOR
Options: STARTS_WITH, ENDS_WITH, CONTAINS, REGEXP, ALL
In this example, we will use:
[STARTS_WITH]: ALL
Enter the required constraint(s), separated by commas
Options: NOT_NULL, UNIQUE, PRIMARYKEY, FOREIGNKEY, DEFAULT
In this example, we will use:
[PRIMARYKEY]: PRIMARYKEY
Set 'CASE_SENSITIVE' to true or false depending on how narrow you want your search to be.
In this example, we will set it to true.
Set the MESSAGE to match for regular expression <SEARCH_STRING> was detected in Changeset.
All tables must have primary key.
Enter this command into the CLI:
Give your check a short name for easier identification.
In this example we will use:
Set the Severity to return a code of 0-4 when triggered.
Options: 'INFO'=0, 'MINOR'=1, 'MAJOR'=2, 'CRITICAL'=3, 'BLOCKER'=4
Enter the shortname, logic conditional (using &&, ||, !), and optional (groupings) for your checks.
Example: "(shortname1 && shortname2) || shortname3":
We will enter:
TablesMustHavePK && TablenameContainsNPK
Set 'MESSAGE' [A match for regular expression <SEARCH_STRING> was detected in Changeset .]:
Results
The regex custom policy check is created successfully.
Sample passing tables
CREATE TABLE `tablenpk` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL
);
CREATE TABLE `tablewithpk` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
Sample failing table
CREATE TABLE `tablewithoutpk` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL
);
Sample error message
DATABASE CHECKS
----------------
Validation of the database snapshot found the following issues:
Check Name: Chained checks template (TablesWithoutPKNamingStandard)
Object Type: table
Object Name: tablewithoutpk
Object Location: horses.horses.tablewithoutpk
Check Severity: MAJOR (Return code: 2)
Message: Tables without primary keys must have npk in the table name