Files

136 lines
5.1 KiB
MySQL
Raw Permalink Normal View History

2026-07-31 16:59:55 +08:00
CREATE TABLE IF NOT EXISTS schema_migrations (
version BIGINT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
applied_at TIMESTAMPTZ NOT NULL
);
CREATE TABLE authorization_subjects (
id UUID PRIMARY KEY,
platform_name VARCHAR(128) NOT NULL,
workspace VARCHAR(128) NOT NULL,
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL,
CONSTRAINT authorization_subjects_platform_workspace_key
UNIQUE (platform_name, workspace),
CONSTRAINT authorization_subjects_platform_name_not_blank
CHECK (btrim(platform_name) <> '' AND platform_name = btrim(platform_name)),
CONSTRAINT authorization_subjects_workspace_not_blank
CHECK (btrim(workspace) <> '' AND workspace = btrim(workspace)),
CONSTRAINT authorization_subjects_platform_name_no_control
CHECK (platform_name !~ '[[:cntrl:]]'),
CONSTRAINT authorization_subjects_workspace_no_control
CHECK (workspace !~ '[[:cntrl:]]')
);
CREATE TABLE signing_keys (
id UUID PRIMARY KEY,
public_key BYTEA NOT NULL,
certificate_json JSONB NOT NULL,
fingerprint_sha256 CHAR(64) NOT NULL,
status VARCHAR(16) NOT NULL,
activated_at TIMESTAMPTZ NOT NULL,
retired_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL,
CONSTRAINT signing_keys_fingerprint_sha256_key
UNIQUE (fingerprint_sha256),
CONSTRAINT signing_keys_status_check
CHECK (status IN ('active', 'retired')),
CONSTRAINT signing_keys_public_key_length_check
CHECK (octet_length(public_key) = 32),
CONSTRAINT signing_keys_fingerprint_length_check
CHECK (fingerprint_sha256::text ~ '^[0-9A-F]{64}$')
);
CREATE TABLE licence_issuances (
id UUID PRIMARY KEY,
subject_id UUID NOT NULL,
issuance_type VARCHAR(16) NOT NULL,
previous_licence_id UUID,
valid_from DATE NOT NULL,
expires_on DATE NOT NULL,
max_database BIGINT NOT NULL,
max_middleware BIGINT NOT NULL,
max_network_device BIGINT NOT NULL,
max_security BIGINT NOT NULL,
max_storage BIGINT NOT NULL,
max_pc BIGINT NOT NULL,
max_server BIGINT NOT NULL,
max_user BIGINT NOT NULL,
max_role BIGINT NOT NULL,
max_permission BIGINT NOT NULL,
max_menu BIGINT NOT NULL,
signing_key_id UUID NOT NULL,
payload_json JSONB NOT NULL,
file_content BYTEA NOT NULL,
issued_at TIMESTAMPTZ NOT NULL,
operator_name VARCHAR(128) NOT NULL,
CONSTRAINT licence_issuances_id_subject_key
UNIQUE (id, subject_id),
CONSTRAINT licence_issuances_subject_id_fkey
FOREIGN KEY (subject_id)
REFERENCES authorization_subjects (id)
ON DELETE RESTRICT,
CONSTRAINT licence_issuances_signing_key_id_fkey
FOREIGN KEY (signing_key_id)
REFERENCES signing_keys (id)
ON DELETE RESTRICT,
CONSTRAINT licence_issuances_previous_subject_fkey
FOREIGN KEY (previous_licence_id, subject_id)
REFERENCES licence_issuances (id, subject_id)
ON DELETE RESTRICT,
CONSTRAINT licence_issuances_type_check
CHECK (issuance_type IN ('issue', 'renewal')),
CONSTRAINT licence_issuances_dates_check
CHECK (valid_from <= expires_on),
CONSTRAINT licence_issuances_previous_check
CHECK (
(issuance_type = 'issue' AND previous_licence_id IS NULL) OR
(issuance_type = 'renewal' AND previous_licence_id IS NOT NULL)
),
CONSTRAINT licence_issuances_max_database_non_negative_check
CHECK (max_database >= 0),
CONSTRAINT licence_issuances_max_middleware_non_negative_check
CHECK (max_middleware >= 0),
CONSTRAINT licence_issuances_max_network_device_non_negative_check
CHECK (max_network_device >= 0),
CONSTRAINT licence_issuances_max_security_non_negative_check
CHECK (max_security >= 0),
CONSTRAINT licence_issuances_max_storage_non_negative_check
CHECK (max_storage >= 0),
CONSTRAINT licence_issuances_max_pc_non_negative_check
CHECK (max_pc >= 0),
CONSTRAINT licence_issuances_max_server_non_negative_check
CHECK (max_server >= 0),
CONSTRAINT licence_issuances_max_user_non_negative_check
CHECK (max_user >= 0),
CONSTRAINT licence_issuances_max_role_non_negative_check
CHECK (max_role >= 0),
CONSTRAINT licence_issuances_max_permission_non_negative_check
CHECK (max_permission >= 0),
CONSTRAINT licence_issuances_max_menu_non_negative_check
CHECK (max_menu >= 0)
);
CREATE UNIQUE INDEX signing_keys_one_active_idx
ON signing_keys ((status))
WHERE status = 'active';
CREATE INDEX authorization_subjects_created_at_idx
ON authorization_subjects (created_at DESC, id DESC);
CREATE INDEX licence_issuances_issued_at_idx
ON licence_issuances (issued_at DESC, id DESC);
CREATE INDEX licence_issuances_subject_issued_at_idx
ON licence_issuances (subject_id, issued_at DESC, id DESC);
CREATE INDEX licence_issuances_expires_on_idx
ON licence_issuances (expires_on, id);
CREATE INDEX licence_issuances_previous_licence_id_idx
ON licence_issuances (previous_licence_id)
WHERE previous_licence_id IS NOT NULL;
CREATE INDEX licence_issuances_signing_key_id_idx
ON licence_issuances (signing_key_id);