52 lines
2.6 KiB
SQL
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.
|
|
-- ============================================================
|