diff --git a/migrations/05_triggers.sql b/migrations/05_triggers.sql new file mode 100644 index 0000000..5d4b489 --- /dev/null +++ b/migrations/05_triggers.sql @@ -0,0 +1,150 @@ +-- ============================================= +-- 05_triggers.sql : Timestamps automatiques +-- - Ajoute (si absent) cree_le DEFAULT now() et modifie_le DEFAULT now() +-- - Crée un trigger BEFORE UPDATE pour mettre à jour modifie_le +-- - Idempotent (DROP TRIGGER IF EXISTS / IF NOT EXISTS) +-- A exécuter après 01_init.sql, 02_indexes.sql, 03_checks.sql +-- ============================================= + +-- 1) Fonction unique de mise à jour du timestamp +CREATE OR REPLACE FUNCTION set_modifie_le() +RETURNS TRIGGER AS $$ +BEGIN + NEW.modifie_le := NOW(); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- Helper macro-like: pour chaque table, s'assurer des colonnes & trigger +-- (on ne peut pas faire de macro, donc on répète pour chaque table) + +-- Liste des tables concernées : +-- utilisateurs, assistantes_maternelles, parents, enfants, enfants_parents, +-- dossiers, messages, contrats, avenants_contrats, evenements, +-- signalements_bugs, uploads, notifications, validations + +-- ========== UTILISATEURS +ALTER TABLE utilisateurs + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_utilisateurs_set_modifie_le ON utilisateurs; +CREATE TRIGGER trg_utilisateurs_set_modifie_le +BEFORE UPDATE ON utilisateurs +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== ASSISTANTES_MATERNELLES +ALTER TABLE assistantes_maternelles + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_am_set_modifie_le ON assistantes_maternelles; +CREATE TRIGGER trg_am_set_modifie_le +BEFORE UPDATE ON assistantes_maternelles +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== PARENTS +ALTER TABLE parents + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_parents_set_modifie_le ON parents; +CREATE TRIGGER trg_parents_set_modifie_le +BEFORE UPDATE ON parents +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== ENFANTS +ALTER TABLE enfants + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_enfants_set_modifie_le ON enfants; +CREATE TRIGGER trg_enfants_set_modifie_le +BEFORE UPDATE ON enfants +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== ENFANTS_PARENTS (table de liaison) +ALTER TABLE enfants_parents + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_enfants_parents_set_modifie_le ON enfants_parents; +CREATE TRIGGER trg_enfants_parents_set_modifie_le +BEFORE UPDATE ON enfants_parents +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== DOSSIERS +ALTER TABLE dossiers + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_dossiers_set_modifie_le ON dossiers; +CREATE TRIGGER trg_dossiers_set_modifie_le +BEFORE UPDATE ON dossiers +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== MESSAGES +ALTER TABLE messages + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_messages_set_modifie_le ON messages; +CREATE TRIGGER trg_messages_set_modifie_le +BEFORE UPDATE ON messages +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== CONTRATS +ALTER TABLE contrats + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_contrats_set_modifie_le ON contrats; +CREATE TRIGGER trg_contrats_set_modifie_le +BEFORE UPDATE ON contrats +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== AVENANTS_CONTRATS +ALTER TABLE avenants_contrats + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_avenants_contrats_set_modifie_le ON avenants_contrats; +CREATE TRIGGER trg_avenants_contrats_set_modifie_le +BEFORE UPDATE ON avenants_contrats +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== EVENEMENTS +ALTER TABLE evenements + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_evenements_set_modifie_le ON evenements; +CREATE TRIGGER trg_evenements_set_modifie_le +BEFORE UPDATE ON evenements +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== SIGNALEMENTS_BUGS +ALTER TABLE signalements_bugs + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_signalements_bugs_set_modifie_le ON signalements_bugs; +CREATE TRIGGER trg_signalements_bugs_set_modifie_le +BEFORE UPDATE ON signalements_bugs +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== UPLOADS +ALTER TABLE uploads + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_uploads_set_modifie_le ON uploads; +CREATE TRIGGER trg_uploads_set_modifie_le +BEFORE UPDATE ON uploads +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== NOTIFICATIONS +ALTER TABLE notifications + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_notifications_set_modifie_le ON notifications; +CREATE TRIGGER trg_notifications_set_modifie_le +BEFORE UPDATE ON notifications +FOR EACH ROW EXECUTE FUNCTION set_modifie_le(); + +-- ========== VALIDATIONS +ALTER TABLE validations + ADD COLUMN IF NOT EXISTS cree_le TIMESTAMP DEFAULT NOW(), + ADD COLUMN IF NOT EXISTS modifie_le TIMESTAMP DEFAULT NOW(); +DROP TRIGGER IF EXISTS trg_validations_set_modifie_le ON validations; +CREATE TRIGGER trg_validations_set_modifie_le +BEFORE UPDATE ON validations +FOR EACH ROW EXECUTE FUNCTION set_modifie_le();