CREATE DATABASE cwa;
REVOKE ALL ON cwa FROM PUBLIC;
9/x
CREATE ROLE cwa_users;
CREATE USER cwa_reader IN ROLE cwa_user PASSWORD 'change-me-in-prod';
CREATE USER cwa_inserter IN ROLE cwa_user PASSWO[…];
10/x
GRANT CONNECT ON DATABASE to cwa_users;
Die Tabelle (github.com/corona-warn-ap…) wird normal angelegt, aber …
11/x
REVOKE ALL ON diagnosis_key FROM PUBLIC;
REVOKE ALL ON diagnosis_key FROM current_user;
12/x
GRANT SELECT ON diagnosis_key TO cwa_reader;
GRANT INSERT ON diagnosis_key TO cwa_inserter;
Der _reader darf nur lesen, der _writer nur einfügen. Niemand darf etwas ändern oder löschen – der Superuser darf aber immer alles.
13/x
14/x
SELECT age(submission_timestamp);
SELECT submission_timestamp - '1 day'::interval;
15/x
DELETE FROM diagnosis_key WHERE age(submission_timestamp) > 30; -- alles nach 30 Tagen löschen
Das ist aber relativ langsam und zerstückelt die Datenbank, besser: Partitionierung.
16/x
RETURNS JSONB
AS 'SELECT key_data FROM diagnosis_key WHERE id = in_id;'
LANGUAGE sql SECURITY DEFINER SET search_path = :schema, pg_temp;
Mit dabei gleich noch die ID Änderungen und Daten als JSONB statt BYTEA …
22/x
ALTER FUNCTION get_key_data(UUID) OWNER TO cwa_owner;
REVOKE ALL ON FUNCTION get_key_dataUUID) FROM PUBLIC;
GRANT EXECUTE ON FUNCTION get_key_data(UUID) TO cwa_reader;
23/x