diff --git a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/database/table.sql b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/database/table.sql index 0d7f1b82e..21c2cba09 100644 --- a/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/database/table.sql +++ b/packages/metaschema-schema/deploy/schemas/metaschema_public/tables/database/table.sql @@ -18,6 +18,16 @@ CREATE TABLE metaschema_public.database ( -- Write-once: first row to set it wins; immutable once true. platform boolean NOT NULL DEFAULT false, + -- Operational access standing. NULL = in good standing; set = every serving + -- lane (pg-wire proxy, gateways, GraphQL, workers) refuses work for this + -- database. System-controlled: tenants read it, only the system role or a + -- platform admin writes it (guard trigger in the metaschema module). The + -- reason names who set it — 'billing' clears automatically when allowance + -- returns, 'admin' only when an admin lifts it. Not an audit log: billing + -- state is the record of WHY; this is only the current on/off derived from it. + suspended_at timestamptz, + suspended_reason text, + created_at timestamptz DEFAULT now(), updated_at timestamptz DEFAULT now(), @@ -27,11 +37,20 @@ CREATE TABLE metaschema_public.database ( ALTER TABLE metaschema_public.database ADD CONSTRAINT db_namechk CHECK (char_length(name) > 2); +ALTER TABLE metaschema_public.database + ADD CONSTRAINT database_suspension_chk CHECK ( + (suspended_at IS NULL) = (suspended_reason IS NULL) + AND (suspended_reason IS NULL OR suspended_reason IN ('billing', 'admin')) + ); + CREATE UNIQUE INDEX databases_database_platform_singleton_idx ON metaschema_public.database (platform) WHERE platform; CREATE INDEX database_owner_id_idx ON metaschema_public.database ( owner_id ); +CREATE INDEX database_suspended_at_idx ON metaschema_public.database ( suspended_at ); COMMENT ON COLUMN metaschema_public.database.schema_hash IS '@behavior -*'; +COMMENT ON COLUMN metaschema_public.database.suspended_at IS '@behavior -insert -update'; +COMMENT ON COLUMN metaschema_public.database.suspended_reason IS '@behavior -insert -update'; COMMIT; diff --git a/packages/metaschema-schema/sql/metaschema-schema--0.44.0.bundle.tar.gz b/packages/metaschema-schema/sql/metaschema-schema--0.44.0.bundle.tar.gz index cb3f0b83a..0965149dc 100644 Binary files a/packages/metaschema-schema/sql/metaschema-schema--0.44.0.bundle.tar.gz and b/packages/metaschema-schema/sql/metaschema-schema--0.44.0.bundle.tar.gz differ diff --git a/packages/metaschema-schema/sql/metaschema-schema--0.44.0.sql b/packages/metaschema-schema/sql/metaschema-schema--0.44.0.sql index 4780454af..1a00ddfa2 100644 --- a/packages/metaschema-schema/sql/metaschema-schema--0.44.0.sql +++ b/packages/metaschema-schema/sql/metaschema-schema--0.44.0.sql @@ -337,6 +337,8 @@ CREATE TABLE metaschema_public.database ( label text, hash uuid, platform boolean NOT NULL DEFAULT false, + suspended_at timestamptz, + suspended_reason text, created_at timestamptz DEFAULT now(), updated_at timestamptz DEFAULT now(), UNIQUE (schema_hash) @@ -346,12 +348,26 @@ ALTER TABLE metaschema_public.database ADD CONSTRAINT db_namechk CHECK (char_length(name) > 2); +ALTER TABLE metaschema_public.database + ADD CONSTRAINT database_suspension_chk + CHECK ( + (suspended_at IS NULL) = (suspended_reason IS NULL) + AND (suspended_reason IS NULL + OR suspended_reason IN ('billing', 'admin')) + ); + CREATE UNIQUE INDEX databases_database_platform_singleton_idx ON metaschema_public.database (platform) WHERE platform; CREATE INDEX database_owner_id_idx ON metaschema_public.database (owner_id); +CREATE INDEX database_suspended_at_idx ON metaschema_public.database (suspended_at); + COMMENT ON COLUMN metaschema_public.database.schema_hash IS '@behavior -*'; +COMMENT ON COLUMN metaschema_public.database.suspended_at IS '@behavior -insert -update'; + +COMMENT ON COLUMN metaschema_public.database.suspended_reason IS '@behavior -insert -update'; + CREATE TABLE metaschema_public.schema ( id uuid PRIMARY KEY DEFAULT uuidv7(), database_id uuid NOT NULL,