Files
btcdata-archive/sql/setup.sql
T

31 lines
1.5 KiB
PL/PgSQL

-- Operator-run only: psql -v ON_ERROR_STOP=1 -v runtime_role=btcdata_archiver -f sql/setup.sql
-- Create the login separately with a password supplied through secure operator tooling.
BEGIN;
CREATE SCHEMA IF NOT EXISTS btcdata_archive;
CREATE TABLE IF NOT EXISTS btcdata_archive.weeks (
week_start timestamptz PRIMARY KEY,
week_end timestamptz NOT NULL,
format_version integer NOT NULL CHECK (format_version = 1),
status text NOT NULL CHECK (status IN ('exporting','verified','pruning','complete','failed')),
object_key text NOT NULL,
object_version_id text,
file_sha256 text CHECK (file_sha256 ~ '^[0-9a-f]{64}$'),
row_counts jsonb,
deletion_counts jsonb,
attempt_time timestamptz NOT NULL,
completion_time timestamptz,
last_error text,
CHECK (week_end - week_start = interval '168 hours'),
CHECK (extract(isodow FROM week_start AT TIME ZONE 'UTC') = 1),
CHECK ((week_start AT TIME ZONE 'UTC')::time = time '00:00:00'),
CHECK (status NOT IN ('verified','pruning','complete') OR
(object_version_id IS NOT NULL AND object_version_id <> 'null' AND file_sha256 IS NOT NULL))
);
REVOKE ALL ON SCHEMA btcdata_archive FROM PUBLIC;
REVOKE ALL ON btcdata_archive.weeks FROM PUBLIC;
GRANT CONNECT, TEMPORARY ON DATABASE :"DBNAME" TO :"runtime_role";
GRANT USAGE ON SCHEMA public, btcdata_archive TO :"runtime_role";
GRANT SELECT, DELETE ON public.binance_price, public.strike_price, public.kraken_minute TO :"runtime_role";
GRANT SELECT, INSERT, UPDATE ON btcdata_archive.weeks TO :"runtime_role";
COMMIT;