diff --git a/sql/nouvelles_tables_archivage.sql b/sql/nouvelles_tables_archivage.sql new file mode 100644 index 0000000..db59782 --- /dev/null +++ b/sql/nouvelles_tables_archivage.sql @@ -0,0 +1,62 @@ +-- ============================================================================ +-- Nouvelles tables pour le chantier "archivage flotte" (cf synthèse §32-33). +-- À exécuter sur la base ship2net (VPS), après TB_Bateaux/TB_Shipmembers. +-- ============================================================================ + +-- ---------------------------------------------------------------------------- +-- TB_Affectations_bateau : historique des affectations boîtier (adresse MAC) +-- ↔ bateau. Au plus une ligne active (Date_fin IS NULL) par bateau et par +-- boîtier - garanti au niveau base via deux colonnes calculées ('actif' +-- devient NULL dès que Date_fin est renseignée, et MariaDB autorise +-- plusieurs NULL dans un index UNIQUE) plutôt que délégué uniquement au code. +-- ---------------------------------------------------------------------------- +CREATE TABLE `TB_Affectations_bateau` ( + `Cle_primaire` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `ID_Bateau` INT UNSIGNED NOT NULL COMMENT 'Clé_primaire dans TB_Bateaux', + `Adresse_mac` VARCHAR(17) NOT NULL COMMENT 'Identité du boîtier (TB_Cartes.Adresse_mac), format XX:XX:XX:XX:XX:XX', + `Date_debut` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `Date_fin` DATETIME NULL DEFAULT NULL COMMENT 'NULL = affectation active', + `Cree_par` INT UNSIGNED NOT NULL COMMENT 'Clé_primaire dans TB_Shipmembers (ID) - l''administrateur ayant fait le geste', + `ID_Bateau_actif` INT UNSIGNED GENERATED ALWAYS AS (IF(`Date_fin` IS NULL, `ID_Bateau`, NULL)) VIRTUAL, + `Adresse_mac_actif` VARCHAR(17) GENERATED ALWAYS AS (IF(`Date_fin` IS NULL, `Adresse_mac`, NULL)) VIRTUAL, + PRIMARY KEY (`Cle_primaire`), + UNIQUE KEY `uniq_bateau_actif` (`ID_Bateau_actif`), + UNIQUE KEY `uniq_mac_actif` (`Adresse_mac_actif`), + KEY `idx_adresse_mac` (`Adresse_mac`), + CONSTRAINT `fk_affectation_bateau` FOREIGN KEY (`ID_Bateau`) REFERENCES `TB_Bateaux` (`Cle_primaire`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `fk_affectation_shipmember` FOREIGN KEY (`Cree_par`) REFERENCES `TB_Shipmembers` (`ID`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; + +-- ---------------------------------------------------------------------------- +-- TB_Archives_traitees : une ligne par archive reçue, quel que soit son +-- résultat (traitée, en quarantaine, rejetée) - fusionne ce qui avait été +-- envisagé séparément comme suivi anti-double-traitement et comme table de +-- quarantaine. L'index UNIQUE sur Nom_fichier sert lui-même de garde-fou +-- anti-double-traitement au niveau base, en complément de la vérification +-- applicative avant tout chargement (cf synthèse §32.6). +-- ---------------------------------------------------------------------------- +CREATE TABLE `TB_Archives_traitees` ( + `Cle_primaire` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `Nom_fichier` VARCHAR(80) NOT NULL COMMENT 'Format : __.sql.gz.enc', + `Adresse_mac` VARCHAR(17) NOT NULL, + `ID_Bateau_resolu` INT UNSIGNED NULL COMMENT 'Déduit de TB_Affectations_bateau à la réception - NULL si aucune affectation active trouvée', + `ID_Bateau_final` INT UNSIGNED NULL COMMENT 'Renseigné une fois le traitement définitivement statué (peut différer du résolu)', + `Statut` ENUM('traitee', 'en_quarantaine_mmsi', 'en_quarantaine_sans_affectation', 'rejetee') NOT NULL, + `MMSI_recu` VARCHAR(9) NULL, + `MMSI_attendu` VARCHAR(9) NULL, + `Date_reception` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `Date_resolution` DATETIME NULL DEFAULT NULL COMMENT 'NULL tant que le statut est encore "en attente" (une des deux valeurs en_quarantaine_*)', + PRIMARY KEY (`Cle_primaire`), + UNIQUE KEY `uniq_nom_fichier` (`Nom_fichier`), + KEY `idx_adresse_mac` (`Adresse_mac`), + KEY `idx_statut` (`Statut`), + CONSTRAINT `fk_archive_bateau_resolu` FOREIGN KEY (`ID_Bateau_resolu`) REFERENCES `TB_Bateaux` (`Cle_primaire`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `fk_archive_bateau_final` FOREIGN KEY (`ID_Bateau_final`) REFERENCES `TB_Bateaux` (`Cle_primaire`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; + +-- ---------------------------------------------------------------------------- +-- TB_Bateaux.MMSI : renseigné automatiquement à la première archive reçue si +-- NULL, sert ensuite de contrôle de plausibilité (cf synthèse §32.3). +-- ---------------------------------------------------------------------------- +ALTER TABLE `TB_Bateaux` + ADD COLUMN `MMSI` VARCHAR(9) NULL DEFAULT NULL COMMENT 'Numéro MMSI du bateau, pour contrôle de plausibilité des archives reçues' AFTER `Nom`;