Checks
diesel-guard ships safety checks covering the most common Postgres migration hazards.
| Check | Operation | Lock Type |
|---|---|---|
| Add Check Constraint | ALTER TABLE ... ADD CONSTRAINT ... CHECK without NOT VALID | ACCESS EXCLUSIVE |
| ADD COLUMN with DEFAULT | ALTER TABLE ... ADD COLUMN ... DEFAULT | ACCESS EXCLUSIVE + table rewrite |
| Adding an EXCLUDE Constraint | ALTER TABLE ... ADD CONSTRAINT ... EXCLUDE | SHARE ROW EXCLUSIVE + full table scan |
| Add Foreign Key | ALTER TABLE ... ADD FOREIGN KEY without NOT VALID | ShareRowExclusiveLock |
| Adding an Index | CREATE INDEX without CONCURRENTLY; CREATE INDEX CONCURRENTLY inside a transaction | SHARE |
| Adding a UNIQUE Constraint | ALTER TABLE ... ADD UNIQUE | ACCESS EXCLUSIVE |
| Changing Column Type | ALTER TABLE ... ALTER COLUMN ... TYPE | ACCESS EXCLUSIVE + table rewrite |
| CHAR Fields | CHAR/CHARACTER column types | — (best practice) |
| Create Table with SERIAL | SERIAL/BIGSERIAL/SMALLSERIAL in CREATE TABLE | — (best practice) |
| Creating an Extension | CREATE EXTENSION | — (requires superuser) |
| Domain CHECK Constraint | ALTER DOMAIN ... ADD CONSTRAINT ... CHECK without NOT VALID | ACCESS EXCLUSIVE |
| Dropping a Column | ALTER TABLE ... DROP COLUMN | ACCESS EXCLUSIVE |
| Dropping a Constraint | Unnamed UNIQUE/FOREIGN KEY/CHECK constraints | — (best practice) |
| Dropping a Database | DROP DATABASE | Exclusive access |
| Dropping an Index | DROP INDEX without CONCURRENTLY; DROP INDEX CONCURRENTLY inside a transaction | ACCESS EXCLUSIVE |
| Dropping a Primary Key | ALTER TABLE ... DROP CONSTRAINT ... pkey | ACCESS EXCLUSIVE |
| Dropping a Table | DROP TABLE | ACCESS EXCLUSIVE |
| Generated Columns | ADD COLUMN ... GENERATED ALWAYS AS ... STORED | ACCESS EXCLUSIVE + table rewrite |
| JSON Fields | ADD COLUMN ... JSON | — (best practice) |
| Mutation without WHERE | DELETE FROM table or UPDATE table SET ... without WHERE | ACCESS EXCLUSIVE / ROW EXCLUSIVE |
| Wide Indexes | CREATE INDEX with 4+ columns | — (best practice) |
| REFRESH MATERIALIZED VIEW | REFRESH MATERIALIZED VIEW without CONCURRENTLY; REFRESH MATERIALIZED VIEW CONCURRENTLY inside a transaction | ACCESS EXCLUSIVE |
| Renaming a Column | ALTER TABLE ... RENAME COLUMN | ACCESS EXCLUSIVE |
| Renaming a Schema | ALTER SCHEMA ... RENAME TO | ACCESS EXCLUSIVE |
| Renaming a Table | ALTER TABLE ... RENAME TO | ACCESS EXCLUSIVE |
| REINDEX | REINDEX without CONCURRENTLY; REINDEX CONCURRENTLY inside a transaction | ACCESS EXCLUSIVE |
| SERIAL Primary Keys | ADD COLUMN ... SERIAL/BIGSERIAL | ACCESS EXCLUSIVE + table rewrite |
| SET NOT NULL | ALTER TABLE ... ALTER COLUMN ... SET NOT NULL | ACCESS EXCLUSIVE |
| Short Primary Keys | SMALLINT/INT primary keys | — (best practice) |
| TIMESTAMP Fields | TIMESTAMP without time zone | — (best practice) |
| TRUNCATE TABLE | TRUNCATE TABLE | ACCESS EXCLUSIVE |
| Unnamed Constraints | Constraints without explicit names | — (best practice) |
Need project-specific rules beyond these? See Custom Checks.