From 76d1dc5e006333d38dbbdfe707c469754fe70ef8 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Sat, 20 Jun 2026 14:25:03 +0200 Subject: [PATCH] fix(db): dedupe doc_check_controls 3x + unique constraint compliance.doc_check_controls war auf prod historisch trippliziert (Dump-Artefakt ohne PK/Unique: jede (doc_type, control_id)-Zeile 3x, 5622 statt 1874 ueber alle 8 doc_types). Die Migration dedupt idempotent (kleinste ctid behalten) und setzt UNIQUE(doc_type, control_id), damit sich die Triplikation nicht wiederholen kann. Auf prod bereits direkt angewandt und in _migration_history registriert (read-only verifiziert: 1874, alle doc_types total=distinct, Constraint aktiv); dieser Commit codifiziert die Migration in der Deploy-Kette, damit ein Restore aus einem aelteren Dump sie automatisch re-appliziert. [migration-approved] Co-Authored-By: Claude Opus 4.7 --- .../158_dedup_doc_check_controls.sql | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 backend-compliance/migrations/158_dedup_doc_check_controls.sql 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$;