diff --git a/backend-compliance/migrations/158_dedup_doc_check_controls.sql b/backend-compliance/migrations/158_dedup_doc_check_controls.sql new file mode 100644 index 00000000..52b98be1 --- /dev/null +++ b/backend-compliance/migrations/158_dedup_doc_check_controls.sql @@ -0,0 +1,27 @@ +-- 158_dedup_doc_check_controls.sql +-- Behebt die historische Triplikation von compliance.doc_check_controls +-- (Dump-Artefakt: kein PK/Unique -> identische Zeilen mehrfach; prod 3x). +-- Idempotent + verhindert Wiederkehr. macmini ist bereits dedupt (no-op), +-- prod wird 1713->571 / 1143->381 / 225->75 dedupt. +-- [migration-approved] + +-- 1) Dedup: pro (doc_type, control_id) nur die Zeile mit kleinster ctid behalten. +DELETE FROM compliance.doc_check_controls a +USING compliance.doc_check_controls b +WHERE a.ctid > b.ctid + AND a.doc_type IS NOT DISTINCT FROM b.doc_type + AND a.control_id IS NOT DISTINCT FROM b.control_id; + +-- 2) Wiederkehr verhindern: Unique-Constraint auf (doc_type, control_id). +DO $do$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM pg_constraint + WHERE conname = 'uq_doc_check_controls_doctype_control' + ) THEN + ALTER TABLE compliance.doc_check_controls + ADD CONSTRAINT uq_doc_check_controls_doctype_control + UNIQUE (doc_type, control_id); + END IF; +END +$do$;