SOURCE dans un fichier .sql
Bonjour,
En guise de patches pour mes BDD, j'exécute des fichiers .sql.
Je viens de découvrir BEGIN NOT ATOMIC qui me permet de mieux contrôler mes scripts DML. Exemple :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| DELIMITER //
BEGIN NOT ATOMIC
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
START TRANSACTION;
SELECT 'INE en minuscules' AS 'Traitement :';
UPDATE th_etudiant_etu
SET etu_ine = LOWER(etu_ine);
SELECT 'Suppression utilisateurs obsolètes' AS 'Traitement :';
DELETE FROM th_utilisateur_uti
WHERE uti_login IN ('des', 'utilisateurs', 'a_suprrimer');
SELECT 'Enregistrement du patch' AS Admin;
INSERT INTO pef.ts_database_admin_dba (dba_nom, dba_nature, dba_commande)
VALUES ('plemenager', 'Patch DML', 'PEF_DML_2021-01-20');
UPDATE pef.ts_database_info_dbi
SET dbi_valeur = 'PEF_DML_2021-01-20'
WHERE dbi_libelle = 'Dernier SQL diff.';
COMMIT;
END;
// |
Cette méthode permet d'éviter que le script s'exécute à moitié ou que des requêtes suivant une erreur s'exécutent et risquent de provoquer une incohérence de données.
Malheureursement, le ROLLBACK ne fonctionne que pour les DML mais pas pour les DDL.
Pour les DDL, quand j'ajoute une table, j'utilise la commande SOURCE dans mes scripts de patches :
Code:
1 2 3
| SELECT 'Ajout table des spécificités de la candidature IFSE' AS 'Traitement :';
SOURCE ../Tables/th_candidature_ifse_cif.sql; |
Ça fonctionne très bien depuis longtemps mais j'ai essayé d'appliquer la méthode de contrôle de la bonne exécution des DML aux DDL :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| DELIMITER //
BEGIN NOT ATOMIC
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
-- Suppression des modifs du patch en cas d'erreur
DROP TABLE IF EXISTS th_candidature_ifse_cif;
ALTER TABLE te_experience_professionnelle_exp
DROP COLUMN IF EXISTS exp_precision_statut_pro;
RESIGNAL;
END;
SELECT 'Ajout table des spécificités de la candidature IFSE' AS 'Traitement :';
SOURCE ../Tables/th_candidature_ifse_cif.sql;
SELECT 'Ajout colonne satatut pro à préciser dans te_experience_professionnelle_exp' AS 'Traitement :';
ALTER TABLE te_experience_professionnelle_exp
ADD COLUMN exp_precision_statut_pro TEXT
NOT NULL
DEFAULT ''
COMMENT 'Précision sur le statut professionnel';
SELECT 'Enregistrement du patch' AS 'Traitement : ';
INSERT INTO pef_public.ts_database_admin_dba (dba_nom, dba_nature, dba_commande)
VALUES ('plemenager', 'Patch DDL', 'PFP_DDL_2021-01-19');
UPDATE pef_public.ts_database_info_dbi
SET dbi_valeur = 'PFP_DDL_2021-01-19'
WHERE dbi_libelle = 'Dernier SQL diff.';
END;
// |
Et à l'exécution, j'ai une belle erreur de syntaxe : :calim2:
Citation:
ERROR 1064 (42000) at line 9 in file: 'DDL/PFP_DDL_2021-01-19.sql': You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '../Tables/th_candidature_ifse_cif.sql;
On dirait que la commande SOURCE ne soit pas acceptée dans ce contexte.
Une idée à me soumettre ?