Files
Omika/infra/postgresql/015_diagnostics_retention_untreated.sql
2026-10-23 18:46:50 +02:00

52 lines
2.6 KiB
SQL

-- ============================================================
-- 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 <base> -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 <group_url_identifier recalculé> 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.
-- ============================================================