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 :
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.
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; //
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 :
Ç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 SELECT 'Ajout table des spécificités de la candidature IFSE' AS 'Traitement :'; SOURCE ../Tables/th_candidature_ifse_cif.sql;
Et à l'exécution, j'ai une belle erreur de syntaxe :
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; //
On dirait que la commande SOURCE ne soit pas acceptée dans ce contexte.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;
Une idée à me soumettre ?
Partager