-- ============================================================ -- Omika Diagnostic Center -- 015_diagnostics_retention_untreated.sql -- Rétention : ne pas purger les erreurs non traitées (privilège SELECT colonne-ciblé). -- ============================================================ -- TO RUN ON SRV-OMIKA as PostgreSQL superuser (e.g. psql -U postgres -d -f 015_...), -- AFTER 004 (SELECT/DELETE sur diagnostic_event) et 012 (table diagnostics_tasks). -- -- Guarantees : -- - PostgreSQL 18 compatible. -- - Idempotent : re-running is a no-op (GRANT is idempotent). -- - Non destructive : NO DROP, NO DELETE/TRUNCATE, no data removal. -- - NO password, NO secret. -- -- Règle de conservation : la purge DiagnosticRetentionWorker supprime un événement -- ancien selon DEUX cas : -- 1) événement NON-erreur (trace/debug/info/warning, ou level NULL) → toujours purgé ; -- 2) événement d'ERREUR (error/critical) → purgé SEULEMENT si son groupe possède une -- tâche (diagnostics_tasks) en statut TERMINAL (Resolved/Rejected). Une erreur non -- traitée (aucune tâche, ou Todo/InProgress) est conservée même au-delà du cutoff. -- -- Le DELETE joint donc diagnostics_tasks sur l'identifiant URL-safe du groupe (recalculé -- en SQL, sans colonne fingerprint) : -- -- DELETE FROM diagnostic_event -- WHERE id IN ( -- SELECT id FROM diagnostic_event -- WHERE timestamp_utc < @cutoff -- AND ( -- level IS NULL OR LOWER(level) NOT IN ('error', 'critical') OR -- (LOWER(level) IN ('error', 'critical') AND IN ( -- SELECT group_url_identifier FROM diagnostics_tasks -- WHERE LOWER(status) IN ('resolved','rejected') -- )) -- ) -- ORDER BY timestamp_utc ASC, id ASC -- LIMIT @batchSize -- ) -- -- Jusqu'ici le rôle worker (omika_diagnostics_worker) n'avait AUCUN droit sur -- diagnostics_tasks (012). On accorde le MINIMUM pour le rapprochement : SELECT -- UNIQUEMENT sur group_url_identifier (la clé) et status (le statut terminal). -- NO SELECT sur title/description/cause (notes de support, potentiellement sensibles), -- NO SELECT sur assignee/created_by (usernames), NO UPDATE/INSERT/DELETE. -- ============================================================ GRANT SELECT (group_url_identifier, status) ON TABLE diagnostics_tasks TO omika_diagnostics_worker; -- ============================================================ -- END 015. Ordre serveur : 001 -> 002 -> ... -> 013 -> 014 -> 015. -- ============================================================