Skip to content

Migration Safety

DBWarden classifies migration changes using the Safety enum:

from dbwarden.engine.safety import Safety

assert Safety.SAFE == "SAFE"
assert Safety.INFO == "INFO"
assert Safety.WARN == "WARN"
assert Safety.CRITICAL == "CRITICAL"

Safety Classification by Object Type

Tables & Columns

Change Type Severity Flag Required
Add column INFO None
Drop column WARNING --force
Change column type (safe) INFO None
Change column type (warn) WARNING --force
Change column type (critical) WARNING --force
Change column comment INFO None
Change nullable (SET/DROP NOT NULL) INFO None
Change default (SET/DROP DEFAULT) INFO None
Add autoincrement INFO None
Remove autoincrement WARNING --force
Change PG column meta (storage, compression, collation) WARNING --force
Rename column WARNING --force

Table Properties

Change Type Severity Flag Required
Change fillfactor INFO None
Change tablespace WARNING --force
Change inheritance WARNING --force
Change exclude constraints WARNING --force
Change table comment INFO None
Change object type (logged/unlogged) WARNING --force
Change ON COMMIT WARNING --force

Indexes

Change Type Severity Flag Required
Add index INFO None
Drop index WARNING --force
Change index expression / columns WARNING --force
Add/drop INCLUDE column INFO None
Change index storage parameters INFO None
Change index tablespace WARNING --force

Constraints

Change Type Severity Flag Required
Add FK INFO None
Drop FK WARNING --force
Change FK options WARNING --force
Add unique constraint INFO None
Drop unique constraint WARNING --force
Add check constraint INFO None
Drop check constraint WARNING --force
Add exclude constraint INFO None
Drop exclude constraint WARNING --force
Change constraint deferrability INFO None

Sequences

Change Type Severity Flag Required
Add sequence INFO None
Drop sequence WARNING --force
Change sequence options (start, increment, etc.) WARNING --force

Types

Change Type Severity Flag Required
Add enum value INFO None
Add enum type INFO None
Drop enum type WARNING --force
Add domain INFO None
Drop domain WARNING --force
Change domain definition WARNING --force
Add composite type INFO None
Drop composite type WARNING --force
Change composite type columns WARNING --force

Functions & Procedures

Change Type Severity Flag Required
Add function INFO None
Drop function WARNING --force
Change function body WARNING --force
Add procedure INFO None
Drop procedure WARNING --force

Triggers

Change Type Severity Flag Required
Add trigger INFO None
Drop trigger WARNING --force
Change trigger timing/events WARNING --force
Add constraint trigger INFO None
Drop constraint trigger WARNING --force

Roles & Grants

Change Type Severity Flag Required
Add role INFO None
Drop role WARNING --force
Change role options WARNING --force
Add grant INFO None
Revoke grant WARNING --force
Add default privilege INFO None
Revoke default privilege WARNING --force

Event Triggers

Change Type Severity Flag Required
Add event trigger INFO None
Drop event trigger WARNING --force
Change event trigger tags INFO None

Extended Statistics

Change Type Severity Flag Required
Add extended statistic INFO None
Drop extended statistic WARNING --force
Change kinds / columns WARNING --force
Change statistics target INFO None

Views

Change Type Severity Flag Required
Add view INFO None
Drop view WARNING --force
Change view query WARNING --force
Refresh materialized view INFO None
Change view schema WARNING --force

Schemas

Change Type Severity Flag Required
Add schema INFO None
Drop schema WARNING --force

RLS & Policies

Change Type Severity Flag Required
Enable RLS INFO None
Disable RLS WARNING --force
Force RLS INFO None
Add policy INFO None
Drop policy INFO None
Change policy expression INFO None

Partitions

Change Type Severity Flag Required
Add partition INFO None
Detach partition WARNING --force
Change partition strategy CRITICAL --force

Safe / Warn / Critical Type Changes

Safe Type Changes (INFO)

Conversion Example
VARCHAR(n)VARCHAR(m) (widening) VARCHAR(50)VARCHAR(100)
VARCHARTEXT VARCHARTEXT
Storing to same type family No change
TIMESTAMPTIMESTAMPTZ Adding timezone info
jsonjsonb JSON to binary JSON
Adding NOT NULL when column has no NULLs Safe when data validates

Warn Type Changes (WARNING)

Conversion Example
VARCHAR(n)VARCHAR(m) (narrowing) VARCHAR(100)VARCHAR(50)
INTEGERBIGINT Widening (safe in PG, uses USING)
BIGINTINTEGER Narrowing (potential data loss)
TEXTVARCHAR(n) Truncation risk
NUMERIC(p,s)NUMERIC(p',s') with precision loss May truncate
Any type change that requires USING Needs manual verification

Critical Type Changes (CRITICAL)

Conversion Example
Dropping the only column of a table Always critical
Removing enum values Not supported by PostgreSQL
Changing partition key columns Requires full table rewrite + data migration
Converting from SETOF/TABLE return type Schema breakage