| 12345678910111213141516171819202122232425262728293031323334 |
- """Refuse the first downgrade step while any tenant security fact remains."""
- from alembic import op
- revision = "20260817_525"
- down_revision = "20260817_524"
- branch_labels = None
- depends_on = None
- def upgrade() -> None:
- # Marker-only head: its downgrade is intentionally the outermost safety
- # fence, so Alembic cannot reach 521's compatibility grant with live data.
- pass
- def downgrade() -> None:
- op.execute(
- "DO $$ BEGIN "
- "IF EXISTS(SELECT 1 FROM public.tenants LIMIT 1) "
- "OR EXISTS(SELECT 1 FROM public.tenant_control_memberships LIMIT 1) "
- "OR EXISTS(SELECT 1 FROM public.tenant_control_claims LIMIT 1) "
- "OR EXISTS(SELECT 1 FROM public.tenant_control_outbox LIMIT 1) "
- "OR EXISTS(SELECT 1 FROM public.tenant_control_outbox_scope_lookup LIMIT 1) "
- "OR EXISTS(SELECT 1 FROM public.tenant_provision_operations LIMIT 1) "
- "OR EXISTS(SELECT 1 FROM public.tenant_approval_facts LIMIT 1) "
- "OR EXISTS(SELECT 1 FROM public.tenant_quotas LIMIT 1) "
- "OR EXISTS(SELECT 1 FROM public.tenant_quota_reservations LIMIT 1) "
- "OR EXISTS(SELECT 1 FROM public.tenant_lifecycle_events LIMIT 1) "
- "OR EXISTS(SELECT 1 FROM public.tenant_audit_events LIMIT 1) "
- "OR EXISTS(SELECT 1 FROM public.tenant_legal_holds LIMIT 1) "
- "THEN RAISE EXCEPTION 'tenant final downgrade refused while tenant control data exists'; END IF; "
- "END $$;"
- )
|