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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
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 ?