CREATE TABLE IF NOT EXISTS maintenance_policy ( id TEXT PRIMARY KEY, name TEXT NOT NULL, table_name TEXT NOT NULL, condition_sql TEXT NOT NULL DEFAULT 'true', retention_period_sec INTEGER, max_rows INTEGER, vacuum_strategy TEXT NOT NULL DEFAULT 'none', schedule_cron TEXT NOT NULL, enabled BOOLEAN NOT NULL DEFAULT true, dry_run_enabled BOOLEAN NOT NULL DEFAULT false, last_run_at TIMESTAMPTZ, last_status TEXT, last_error TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), CONSTRAINT maintenance_policy_name_chk CHECK (length(trim(name)) > 0), CONSTRAINT maintenance_policy_table_name_chk CHECK (length(trim(table_name)) > 0), CONSTRAINT maintenance_policy_vacuum_strategy_chk CHECK ( vacuum_strategy IN ('none', 'vacuum', 'analyze', 'vacuum_analyze', 'reindex') ) ); CREATE INDEX IF NOT EXISTS idx_maintenance_policy_enabled ON maintenance_policy (enabled); CREATE TABLE IF NOT EXISTS maintenance_policy_config_audit ( id TEXT PRIMARY KEY, policy_id TEXT, actor_prefix TEXT NOT NULL, action TEXT NOT NULL, before_json JSONB, after_json JSONB, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), CONSTRAINT maintenance_policy_config_audit_action_chk CHECK ( action IN ('create', 'update', 'delete') ) ); CREATE INDEX IF NOT EXISTS idx_maintenance_policy_config_audit_created ON maintenance_policy_config_audit (created_at DESC); ALTER TABLE postgres_maintenance_audit ADD COLUMN IF NOT EXISTS policy_id TEXT REFERENCES maintenance_policy (id) ON DELETE SET NULL; CREATE INDEX IF NOT EXISTS idx_postgres_maintenance_audit_policy ON postgres_maintenance_audit (policy_id);