-- +goose Up CREATE TABLE evidence_assets ( id TEXT PRIMARY KEY, upload_key TEXT NOT NULL, task_id TEXT NOT NULL, attempt_id TEXT NOT NULL, kind TEXT NOT NULL CHECK (kind = 'SKU_PANEL_GATE_1'), privacy_tier TEXT NOT NULL CHECK (privacy_tier = 'INTERNAL_RAW'), sha256 TEXT NOT NULL CHECK ( length(sha256) = 64 AND sha256 NOT GLOB '*[^0-9a-f]*' ), byte_size INTEGER NOT NULL CHECK ( typeof(byte_size) = 'integer' AND byte_size > 0 AND byte_size <= 10485760 ), content_type TEXT NOT NULL CHECK (content_type = 'image/png'), width_px INTEGER NOT NULL CHECK ( typeof(width_px) = 'integer' AND width_px > 0 AND width_px <= 8192 ), height_px INTEGER NOT NULL CHECK ( typeof(height_px) = 'integer' AND height_px > 0 AND height_px <= 8192 ), storage_key TEXT NOT NULL CHECK ( storage_key = substr(sha256, 1, 2) || '/' || sha256 || '.png' ), uploaded_by_device_id TEXT NOT NULL CHECK (trim(uploaded_by_device_id) <> ''), captured_at TEXT NOT NULL CHECK (trim(captured_at) <> ''), created_at TEXT NOT NULL CHECK (trim(created_at) <> ''), CHECK (width_px * height_px <= 16777216), UNIQUE (uploaded_by_device_id, upload_key), FOREIGN KEY (task_id, attempt_id) REFERENCES purchase_attempts(task_id, id) ); CREATE INDEX evidence_assets_task_time_idx ON evidence_assets (task_id, captured_at, created_at, id); -- +goose Down -- 已写入的内部原图是审计事实,回滚迁移不得静默删除它们。 CREATE TABLE evidence_downgrade_guard ( valid INTEGER NOT NULL CHECK (valid = 1) ); INSERT INTO evidence_downgrade_guard (valid) SELECT CASE WHEN (SELECT COUNT(*) FROM evidence_assets) = 0 THEN 1 ELSE 0 END; DROP TABLE evidence_downgrade_guard; DROP TABLE evidence_assets;