-- ============================================================================ -- 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`;