

- Description
- Un long pipeline traversant une vallée de montagne
- Source
- U.S. Geological Survey · page d’origine
- Licence
- CC0 Domaine public
CI/CD pour la data : bases, datamarts, pipelines et rapports
Vous saurez ce qui rend le CI/CD différent quand le produit contient de la donnée : l'état persiste, le retour arrière est (presque) impossible, les environnements réalistes sont coûteux et…
En bref
- Vous saurez ce qui rend le CI/CD différent quand le produit contient de la donnée : l'état persiste, le retour arrière est (presque) impossible, les environnements réalistes sont coûteux et sensibles.
- Vous connaîtrez les deux philosophies de déploiement de base de données (état déclaratif : dacpac/SSDT ; migrations versionnées : Flyway/Liquibase/scripts), l'idempotence et le rejeu, le déploiement en kits.
- Vous saurez tester des données et des transformations (tests de schéma, de règles, de réconciliation, de non-régression de chiffres), organiser des environnements avec données anonymisées, et traiter la volumétrie.
- Vous aurez un panorama (état 2026-10) de dbt, des pipelines Fabric / Data Factory, des rapports Power BI en PBIP/TMDL et des deployment pipelines.
- Vous disposerez de notes /5 de maturité par pratique et d'une liste de limites propres à la donnée.
Pré-requis : le socle commun est dans 10 CI/CD ; la lecture de 07 Méthodes spécifiques data (section DataOps) aide.
Sur cette page
- 1. Ce qui change quand le produit contient de la donnée
- 2. Versionner une base : état ou migrations
- 3. Idempotence, rejeu et reprise
- 4. Déploiement en kits d'installation
- 5. Tester les données et les transformations
- 6. Environnements, données réalistes et anonymisées
- 7. Volumétrie et temps de traitement
- 8. dbt et la transformation en code
- 9. Pipelines Fabric et Data Factory
- 10. Rapports Power BI : PBIP, TMDL, deployment pipelines
- 11. Rollback impossible sur la donnée
- 12. Qualité continue en production
- 13. Limites propres à la data
- 14. Notes de maturité des pratiques
- 15. Contribution de l'IA
- 16. Voir aussi
Niveau : 🟢→🔴
1. Ce qui change quand le produit contient de la donnée#
🟢 Novice — le code est jetable, la donnée non#
En CI/CD classique, déployer une nouvelle version remplace l'ancienne : l'application n'a pas d'état propre, on peut la reconstruire à l'identique. Dans un datamart, le produit est à la fois du code (tables, procédures, rapports) et un état (les lignes accumulées, historisées, parfois impossibles à reconstruire car la source a changé ou purgé).
Cinq conséquences, chacune développée plus loin :
| Différence | Conséquence |
|---|---|
| L'état persiste | Un déploiement est une transformation d'un état existant, pas un remplacement : on déploie un delta (migration) |
| Le retour arrière est difficile | Une colonne supprimée a perdu ses données ; un chargement partiel a modifié l'historique |
| Le test dépend du contenu | Le même code donne un résultat correct sur un jeu et faux sur un autre ; il faut des données de test représentatives |
| Les environnements sont lourds et sensibles | Copier la production = volume, coût, données personnelles |
| Le résultat est un chiffre | Un test unitaire ne suffit pas : il faut réconcilier avec une référence |
🟡 Pratique — ce qui reste identique#
Les principes du socle (10 CI/CD) restent : tout versionné, reproductible, traçable, petits lots, promotion du même artefact, feedback rapide. La data ajoute des contraintes, elle n'invalide rien.
🔴 Expert — trois couches à déployer, trois rythmes#
Un produit BI se compose de couches aux rythmes et aux risques différents :
Il faut adapter le niveau de contrôle au risque de la couche : un rapport peut être déployé automatiquement après tests ; une migration qui supprime une colonne exige revue, sauvegarde vérifiée et fenêtre. Voir le thème Délais et industrialisation DataOps et Versionnement et industrialisation des rapports.
2. Versionner une base : état ou migrations#
🟢 Novice — deux façons de décrire une base en code#
| Approche | Principe | Exemple d'outils | Ce qu'on versionne |
|---|---|---|---|
| État déclaratif (state-based) | On décrit l'état cible du schéma ; l'outil calcule la différence avec la base réelle et génère le script | Projets de base de données (SSDT / SDK-style Microsoft.Build.Sql) produisant un dacpac, déployé par SqlPackage |
Un fichier .sql par objet (CREATE TABLE, CREATE PROC…) |
| Migrations versionnées (migration-based) | On écrit les changements successifs ; l'outil applique dans l'ordre ceux qui ne l'ont pas été et le consigne dans une table d'historique | Flyway, Liquibase, EF Migrations, scripts maison numérotés | Une suite de scripts V001__…, V002__… |
🟡 Pratique — forces et faiblesses#
| Critère | État déclaratif (dacpac) | Migrations versionnées |
|---|---|---|
| Lisibilité de l'état courant | 5/5 : le dépôt est le schéma | 2/5 : il faut rejouer l'historique mentalement |
| Précision du changement | 3/5 : delta généré, parfois surprenant (renommages, ordre) | 5/5 : on contrôle chaque instruction |
| Gestion des données (backfill, transformation d'une colonne) | 2/5 : hors périmètre naturel, scripts pré/post-déploiement | 5/5 : la migration peut transformer les données |
| Prévention des pertes | 4/5 : BlockOnPossibleDataLoss bloque par défaut |
3/5 : rien ne vous protège d'un DROP écrit |
| Dérive (drift) | 4/5 : le delta révèle les écarts | 2/5 : une modification manuelle n'est pas détectée sans outil |
| Courbe d'apprentissage | 3/5 | 4/5 |
| Idempotence native | 5/5 : on peut rejouer, le delta est vide | 4/5 : table d'historique, chaque script appliqué une fois |
(Notes d'expert pour une équipe de 3 à 8 développeurs SQL Server ; dépendent de la discipline.)
Le paramètre BlockOnPossibleDataLoss de SqlPackage est une garde majeure : il bloque le déploiement si le delta peut faire perdre des données (suppression de table/colonne, rétrécissement de type). Bonne pratique documentée : le désactiver en développement, le garder activé en recette et production avec le même dacpac et des profils de publication différents (état 2026-10).
# Générer un script de déploiement SANS l'exécuter, pour relecture (production)
sqlpackage /Action:Script `
/SourceFile:".\bin\Release\Datamart.dacpac" `
/TargetConnectionString:"$cnxProd" `
/OutputPath:".\delta_prod.sql" `
/p:BlockOnPossibleDataLoss=True `
/p:DropObjectsNotInSource=False
# Rapport de dérive : ce qui diffère entre le dacpac et la base cible
sqlpackage /Action:DeployReport `
/SourceFile:".\bin\Release\Datamart.dacpac" `
/TargetConnectionString:"$cnxProd" `
/OutputPath:".\drift.xml"
DropObjectsNotInSource=False est le réglage prudent : l'outil ne supprime pas ce qui n'est pas dans le projet (objets créés par un tiers, tables de staging, éléments propres au client).
Symptôme : après un déploiement dacpac, une table client personnalisée a disparu. Cause : DropObjectsNotInSource=True avec une base portant des objets hors projet. Remède : laisser à False ; si l'on doit nettoyer, le faire par un script explicite, revu et sauvegardé.
Symptôme : un renommage de colonne est déployé comme « suppression + création » et les données disparaissent. Cause : l'outil de delta ne peut pas deviner une intention de renommage. Remède : utiliser le renommage assisté (sp_rename avec journal de refactoring dans SSDT) ou une migration explicite ; vérifier le script généré avant production.
🔴 Expert — l'approche hybride, la plus fréquente en entreprise#
Dans les faits, on combine :
- État pour les objets sans données ou rejouables : procédures, vues, fonctions (
CREATE OR ALTER), droits. Le dépôt contient la dernière version. - Migrations pour les tables à données : ajout de colonne avec valeur par défaut, scission, fusion, transformation de type, backfill.
- Un journal d'application (table
dbo._SchemaHistoryou équivalent) indiquant version, date, auteur, empreinte du script, durée, résultat.
Modèle de script de migration idempotent et sûr :
-- 2026_10_07__Ajout_colonne_statut_visite.sql
SET XACT_ABORT ON;
BEGIN TRAN;
IF NOT EXISTS (SELECT 1 FROM sys.columns
WHERE object_id = OBJECT_ID(N'[dbo].[VISITE]')
AND name = N'STATUT_COD')
BEGIN
ALTER TABLE [dbo].[VISITE] ADD [STATUT_COD] varchar(10) NULL;
END;
-- Backfill borné et rejouable (ne touche que ce qui n'est pas encore rempli)
UPDATE v SET v.[STATUT_COD] = 'REALISEE'
FROM [dbo].[VISITE] AS v
WHERE v.[STATUT_COD] IS NULL
AND v.[DATE_REALISATION] IS NOT NULL;
COMMIT;
(Attention : un ALTER TABLE … ADD suivi d'un UPDATE référençant la nouvelle colonne dans le même lot peut échouer à la compilation (nom de colonne inconnu) ; séparer en lots GO, ou utiliser EXEC('…'), selon l'outil d'exécution. Sur grosse table, découper l'UPDATE par tranches — voir section 7.)
Outils de déploiement continu pour SQL : l'intégration à Azure Pipelines/TFS se fait par tâches d'installation SqlPackage, sqlcmd ou des scripts PowerShell ; sqlcmd a des options qui modifient le comportement (variables, interprétation de commandes) à connaître — en cas d'usage de kits, voir la section suivante. Voir GDS et données SQL/BI.
Ajoutez un test d'équivalence de schéma dans le pipeline : déployer le projet sur une base vide et appliquer la chaîne de migrations sur une copie de l'état de la version précédente, puis comparer les deux schémas résultants. Toute différence révèle une dérive entre « ce qu'on dit » et « ce qu'on fait ».
3. Idempotence, rejeu et reprise#
🟢 Novice — pourquoi tout doit pouvoir être rejoué#
Un script est idempotent si l'exécuter deux fois (ou dix) donne le même état que l'exécuter une fois. En data, c'est vital : un chargement tombe à 03 h 12 sur 4 tables sur 10 ; la reprise doit être sûre, sans doublons ni trous. Sans idempotence, chaque incident demande un nettoyage manuel — la principale source d'erreurs de production.
🟡 Pratique — patrons d'idempotence#
| Situation | Patron | Exemple |
|---|---|---|
| Création d'objet | IF NOT EXISTS / CREATE OR ALTER |
CREATE OR ALTER PROCEDURE … |
| Ajout de colonne | Test dans sys.columns |
Voir section 2 |
| Chargement de fait | Purge de la tranche puis insertion (par période/lot) ou MERGE sur clé naturelle |
Remplacer la journée J en entier |
| Chargement de dimension | MERGE/upsert sur clé métier + gestion SCD |
Fermer l'ancienne ligne, ouvrir la nouvelle |
| Données de référence | Upsert depuis un script de référence versionné | Table de codes statut |
| Reprise | Journal de lots (lot_id, statut) ; un lot « en cours » est relancé depuis zéro | dbo.Journal_Lot |
Patron « delete-insert par partition logique » (simple, robuste, rejouable) :
DECLARE @DateExploitation date = '2026-10-06'; -- paramètre, jamais GETDATE() dans le traitement
BEGIN TRAN;
DELETE FROM [dm].[FACT_VISITE] WHERE [DATE_VISITE] = @DateExploitation;
INSERT INTO [dm].[FACT_VISITE] ([VISITE_ID], [DATE_VISITE], [COMMERCIAL_ID], [CLIENT_ID], [DUREE_MIN])
SELECT s.[VISITE_ID], s.[DATE_VISITE], s.[COMMERCIAL_ID], s.[CLIENT_ID], s.[DUREE_MIN]
FROM [staging].[VISITE] AS s
WHERE s.[DATE_VISITE] = @DateExploitation;
COMMIT;
Passez la date d'exploitation en paramètre plutôt que d'appeler GETDATE() dans un traitement : rejouer une journée passée doit produire le même résultat que le jour J. C'est la condition du rejeu (recalcul d'un historique après correction de règle).
Symptôme : après relance d'un chargement, les totaux sont doublés. Cause : insertion pure (INSERT) sans purge préalable de la tranche, ou clé d'unicité absente. Remède : patron delete-insert ou MERGE ; contrainte d'unicité sur la clé naturelle du fait pour que l'erreur éclate au lieu de se taire.
🔴 Expert — MERGE, déterminisme et fenêtres de rejeu#
MERGEde SQL Server : puissant mais historiquement entouré de défauts documentés ; pour les cas critiques, beaucoup d'équipes préfèrent les instructions explicitesUPDATEpuisINSERT(dans la même transaction, avec verrous adaptés) ou le patron delete-insert. À vous d'évaluer sur votre version ; à vérifier : l'état des corrections de bogues selon votre version/CU.- Déterminisme : un traitement qui dépend de l'heure, d'un
NEWID(), d'un ordre non spécifié (TOPsansORDER BY), d'une table non figée ne se rejoue pas à l'identique. Les clés de substitution (surrogate keys) générées par séquence posent le même problème : elles varient d'un rejeu à l'autre, donc on garde une clé naturelle stable pour la réconciliation (voir aussi le thème Qualité des données). - Fenêtre de rejeu : définir jusqu'où l'on peut rejouer (7 jours ? 2 ans ?) selon ce que la source conserve. Au-delà, le rejeu est impossible et la donnée devient non reconstructible : traiter l'historique comme un actif à sauvegarder.
- Reprise partielle : un orchestrateur capable de relancer à partir de l'étape en échec, pas depuis le début, économise des heures sur gros volumes — à condition que chaque étape soit idempotente.
4. Déploiement en kits d'installation#
🟢 Novice — pourquoi des « kits »#
Dans beaucoup de contextes B2B, on ne déploie pas soi-même chez le client : on livre un kit (ensemble versionné de scripts, de binaires, de rapports et d'un mode d'emploi) installé par un administrateur — parfois l'éditeur, parfois le client. Le CI/CD produit alors un artefact de livraison qu'on peut installer n fois, dans n environnements, sans qu'on puisse réparer à la main.
🟡 Pratique — anatomie d'un bon kit#
| Élément | Rôle |
|---|---|
| Numéro de version et notes de version | Savoir ce qu'on installe ; ce qui change |
| Pré-requis vérifiés (script de contrôle) | Version du moteur, droits, espace disque, version précédente installée |
| Scripts ordonnés (numérotation) | Ordre d'exécution explicite et reproductible |
| Idempotence | Un kit rejouable sans casse (CREATE OR ALTER, IF NOT EXISTS) |
| Journal d'installation | Qui, quand, quelle version, succès/échec, durée |
| Vérification post-installation | Contrôles automatiques (objets présents, comptages, test fumée) |
| Procédure de retour arrière | Ce qui est réversible, ce qui ne l'est pas |
| Paramétrage non destructif | La configuration du client n'est jamais écrasée par l'installation |
Trois principes d'ingénierie du kit :
- Le kit se construit dans le pipeline, pas à la main : un artefact unique, signé ou empreinté, publié avec sa version.
- Le kit s'installe d'abord par le pipeline sur un environnement de recette dans les mêmes conditions que chez le client (mêmes outils, même ligne de commande) — sinon le kit réussit en recette et échoue chez le client.
- Le kit contient son propre test : un script de contrôle qui rapporte « installé et conforme » ou la liste des écarts.
Symptôme : l'installation « réussit » (code retour 0) mais les libellés accentués sont corrompus ou une partie du script n'a pas été exécutée. Cause : outil d'exécution aux options par défaut inadaptées (encodage, interprétation de variables de scripts), ou code de retour non vérifié. Remède : figer les options d'exécution documentées du kit, fixer l'encodage des fichiers, et ajouter une vérification post-installation qui compare un échantillon de libellés et de comptages ; ne jamais se fier au seul code de retour. (À vérifier sur votre outil d'exécution : l'encodage par défaut et les options varient selon la version.)
Figez l'encodage des fichiers du dépôt (par exemple UTF-8 avec BOM pour les scripts exécutés par des outils Microsoft qui s'appuient sur le BOM pour détecter l'encodage) et testez-le dans le pipeline : un test qui installe un libellé accentué et le relit coûte dix minutes et évite une corruption silencieuse chez le client.
🔴 Expert — compatibilité entre versions de kit#
Le kit N+1 doit pouvoir s'installer sur N et idéalement sur N-1 (saut de version), car les clients ne montent pas à chaque version. Ce qui implique :
- une table de version installée que le kit lit pour décider quelles migrations jouer ;
- des migrations cumulatives (le kit contient la chaîne N-2→N-1→N, ou un script de saut validé) ;
- une matrice de tests de montée de version automatisée (N-1→N, N-2→N) dans le pipeline, avec des bases d'exemple « figées » représentant chaque version ;
- un traitement explicite des personnalisations client (objets ajoutés, paramètres modifiés) : la montée de version ne doit pas les perdre — d'où
DropObjectsNotInSource=Falseet le paramétrage non destructif.
Une équipe maintient 4 versions en parallèle et chaque kit est validé automatiquement : installation à blanc sur base vide, montée depuis les 2 versions précédentes sur bases de référence, puis rapport de comparaison de schéma et 12 contrôles de comptage. Le coût de maintenance de la matrice est réel (quelques jours par version) ; il remplace des jours de dépannage chez les clients. (Ordre de grandeur illustratif.)
Voir aussi la gestion des versions parallèles : stratégies de branches, TFVC en profondeur.
5. Tester les données et les transformations#
🟢 Novice — quatre familles de tests#
| Famille | Question | Exemple | Quand |
|---|---|---|---|
| Tests de schéma | La structure est-elle conforme ? | Table et colonnes attendues, types, clés | À chaque déploiement |
| Tests de règles (unitaires) | Cette transformation donne-t-elle le bon résultat sur un cas connu ? | Mini-jeu d'entrée → sortie attendue | À chaque modification |
| Tests de données (qualité) | Les données respectent-elles les contraintes ? | Unicité, non-nullité, domaine, intégrité référentielle | À chaque chargement |
| Tests de réconciliation / non-régression | Le chiffre est-il toujours le même qu'avant, ou différent pour une bonne raison ? | Total CA par mois avant/après | À chaque livraison |
🟡 Pratique — des tests de transformation sur jeux contrôlés#
Un test de transformation s'écrit comme un test unitaire : un jeu d'entrée minuscule et construit à la main qui couvre les cas limites, une sortie attendue, une comparaison automatique.
-- Test : le dédoublonnage de visites garde la plus récente synchronisation
-- Préparation (dans une base de test ou un schéma [tests])
TRUNCATE TABLE [tests].[VISITE_ENTREE];
INSERT INTO [tests].[VISITE_ENTREE] (VISITE_ID, CLIENT_ID, DATE_VISITE, DATE_SYNC) VALUES
('V1','C1','2026-10-01','2026-10-01T10:00'),
('V1','C1','2026-10-01','2026-10-01T12:00'), -- doublon de synchro : on garde 12:00
('V2','C2','2026-10-02','2026-10-02T09:00');
EXEC [dm].[p_Charge_FACT_VISITE] @Source = 'tests', @DateExploitation = '2026-10-02';
-- Vérification : attendu = 2 lignes, V1 avec la synchro de 12:00
IF (SELECT COUNT(*) FROM [tests].[FACT_VISITE_SORTIE]) <> 2
OR NOT EXISTS (SELECT 1 FROM [tests].[FACT_VISITE_SORTIE]
WHERE VISITE_ID='V1' AND DATE_SYNC='2026-10-01T12:00')
THROW 50001, 'Echec test dedoublonnage visites', 1;
Des cadres de test existent (tSQLt pour SQL Server, notamment ; à vérifier son état de maintenance sur votre version) ; l'essentiel est l'habitude : un cas qui a causé un incident devient un test de non-régression.
Tests de données exécutés à chaque chargement (contrôles bloquants ou avertissements) :
-- Contrôles post-chargement : retourne une ligne par anomalie
SELECT 'Doublon de clé' AS controle, COUNT(*) AS nb
FROM (SELECT VISITE_ID FROM [dm].[FACT_VISITE] GROUP BY VISITE_ID HAVING COUNT(*) > 1) d
HAVING COUNT(*) > 0
UNION ALL
SELECT 'Fait sans commercial', COUNT(*)
FROM [dm].[FACT_VISITE] f
LEFT JOIN [dm].[DIM_COMMERCIAL] c ON c.COMMERCIAL_ID = f.COMMERCIAL_ID
WHERE c.COMMERCIAL_ID IS NULL
HAVING COUNT(*) > 0
UNION ALL
SELECT 'Volume du jour hors tolérance', 1
WHERE (SELECT COUNT(*) FROM [dm].[FACT_VISITE] WHERE DATE_VISITE = CAST(GETDATE()-1 AS date))
< 0.5 * (SELECT AVG(n*1.0) FROM (SELECT COUNT(*) n FROM [dm].[FACT_VISITE]
WHERE DATE_VISITE >= DATEADD(day,-35,CAST(GETDATE() AS date))
AND DATE_VISITE < CAST(GETDATE()-1 AS date) GROUP BY DATE_VISITE) x);
Le dernier contrôle est de type comportemental (volumétrie du jour comparée à la moyenne récente) : il attrape les chargements partiels que les règles d'intégrité ne voient pas.
Classez chaque contrôle en bloquant (le chargement s'arrête, on ne publie pas de chiffres faux) ou avertissement (publié, mais signalé). Une règle sans classification devient du bruit. Chaque alerte doit avoir un propriétaire et une action.
🔴 Expert — la non-régression de chiffres#
Le test le plus précieux et le plus négligé : comparer les indicateurs clés avant/après une modification. Principe : un jeu de requêtes témoins (10 à 30 indicateurs × quelques périodes × quelques périmètres) est exécuté sur l'environnement de référence et sur l'environnement modifié ; l'écart est calculé ; tout écart doit être expliqué (changement voulu, documenté) ou corrigé.
# Comparaison de chiffres témoins entre deux bases (squelette)
$requetes = Get-Content .\temoins.json | ConvertFrom-Json # { nom, sql, tolerance }
foreach ($r in $requetes) {
$ref = Invoke-Sqlcmd -ServerInstance $srv -Database $baseRef -Query $r.sql
$new = Invoke-Sqlcmd -ServerInstance $srv -Database $baseNew -Query $r.sql
$ecart = [math]::Abs($ref.valeur - $new.valeur)
if ($ecart -gt $r.tolerance) {
Write-Warning "$($r.nom) : référence $($ref.valeur), nouveau $($new.valeur)"
$echecs++
}
}
if ($echecs) { exit 1 }
Points d'attention : tolérances (arrondis, flottants) à définir ; jeux de dates figés (on ne compare pas « hier ») ; explication écrite des écarts attendus (sinon le test est désactivé au premier échec). Même idée pour les mesures d'un modèle sémantique : exécuter des requêtes DAX témoins avant/après et comparer. Voir Tests et fiabilité des chiffres et Recette et validation métier.
Symptôme : tous les tests passent, le directeur commercial conteste le chiffre. Cause : les tests vérifient la cohérence interne (clés, comptages) mais jamais la définition métier (« visite » = déclarée ou réalisée ?). Remède : un test de réconciliation avec une référence externe signée par le métier (extrait de l'application source, état comptable) fait partie de la recette ; il se joue à la livraison et se rejoue sur les évolutions.
6. Environnements, données réalistes et anonymisées#
🟢 Novice — le dilemme#
Pour tester sérieusement un traitement de données, il faut des données qui ressemblent à la réalité : mêmes volumes, mêmes cas tordus, mêmes distributions. Or la réalité contient des données personnelles et commerciales sensibles (RGPD). Trois options, avec leur compromis :
| Option | Réalisme | Risque conformité | Coût | Remarque |
|---|---|---|---|---|
| Copie de production | 5/5 | 1/5 (très risqué si non maîtrisé) | Moyen | À éviter hors environnement équivalent à la production en droits |
| Production anonymisée/pseudonymisée | 4/5 | 3-4/5 | Élevé (outillage, validation) | Meilleur compromis ; attention à la ré-identification |
| Données synthétiques | 2-4/5 selon le soin | 5/5 | Moyen à élevé | Bon pour tests unitaires ; les cas limites réels manquent |
| Sous-ensemble (échantillon) | 3/5 | Selon l'anonymisation | Faible | Casse l'intégrité référentielle si mal fait ; ne teste pas la volumétrie |
(Notes d'expert, contexte : données de force de vente avec noms de clients et de contacts ; équipes de 3 à 8 personnes.)
🟡 Pratique — anonymiser sans casser les tests#
Principes :
- Préserver la structure : les relations (clé étrangère, hiérarchies), les distributions (répartition par région, par commercial), les cas limites (valeurs nulles, caractères spéciaux, doublons) — sinon on teste autre chose que la production.
- Remplacer de façon déterministe : un même client doit recevoir le même pseudonyme dans toutes les tables et à tous les rejeux (sinon les jointures cassent). On utilise un hachage avec sel secret ou une table de correspondance.
- Traiter les champs libres (commentaires de visite) : ils contiennent souvent des données personnelles non structurées ; les vider ou les remplacer.
- Conserver ce qui ne l'est pas : les montants, dates, quantités ne sont généralement pas personnels mais peuvent permettre une ré-identification en combinaison ; évaluer le risque.
-- Pseudonymisation déterministe d'un nom client (exemple pédagogique)
UPDATE c
SET c.NOM = CONCAT('Client_', CONVERT(varchar(12), HASHBYTES('SHA2_256', CONCAT(c.CLIENT_ID, @sel)), 2)),
c.ADRESSE = 'Adresse anonymisée',
c.EMAIL = CONCAT(c.CLIENT_ID, '@exemple.invalid')
FROM [dbo].[CLIENT] AS c;
-- @sel est un secret conservé hors du dépôt ; le script s'exécute sur la COPIE, jamais sur la production.
Symptôme : des tests passent sur la base anonymisée mais échouent en production sur des accents ou des noms très longs. Cause : l'anonymisation a normalisé les données (noms courts, ASCII). Remède : générer des valeurs qui conservent les propriétés de test : longueurs variables, accents, apostrophes, espaces, valeurs vides.
Symptôme : une base anonymisée fuite et l'on découvre qu'elle contient encore des noms dans des colonnes oubliées ou dans les journaux. Cause : anonymisation par liste de colonnes connues, sans inventaire. Remède : inventaire systématique (catalogue, recherche de motifs), liste blanche plutôt que liste noire, contrôle automatique après anonymisation (aucune adresse e-mail réelle, aucun motif de nom).
🔴 Expert — conformité et responsabilité#
La pseudonymisation (RGPD) reste une donnée personnelle tant que la clé de correspondance existe ; seule une anonymisation irréversible sort du champ. Conséquences : l'environnement de recette avec données pseudonymisées demeure soumis aux règles d'accès, de durée de conservation, de journalisation. Voir le thème Sécurité, confidentialité, conformité. Consultez le DPO et la politique de votre organisation : ce dossier ne constitue pas un avis juridique.
Maintenez un jeu de données de référence « doré » (golden dataset) de taille modeste, anonymisé, versionné, couvrant tous les cas limites connus (chacun correspond à un incident passé ou à une règle). Il tourne à chaque fusion en quelques minutes. Le gros jeu volumétrique tourne la nuit.
7. Volumétrie et temps de traitement#
🟢 Novice — le test sur « 1 000 lignes » ne prouve rien sur 100 millions#
Un traitement correct sur un petit jeu peut être inutilisable sur le volume réel : plan d'exécution différent, verrouillage, journal de transactions qui gonfle, fenêtre de traitement dépassée. La volumétrie est un risque de projet, pas un détail d'implémentation.
🟡 Pratique — les mesures à intégrer#
- Temps de traitement par étape, tracé à chaque exécution (table de journal) : sans historique, on ne voit pas la dérive.
- Test de charge périodique sur un environnement à volume proche de la production (au moins mensuel, ou à chaque évolution majeure).
- Seuils d'alerte : durée totale > X % de la fenêtre disponible ; croissance du temps > Y % sur 4 semaines.
- Découpage en lots : opérations massives (
UPDATE,DELETE) par tranches pour limiter le journal et les verrous.
-- Suppression/mise à jour par tranches pour éviter journal et verrous excessifs
DECLARE @n int = 1;
WHILE @n > 0
BEGIN
UPDATE TOP (50000) [dbo].[VISITE]
SET [STATUT_COD] = 'REALISEE'
WHERE [STATUT_COD] IS NULL AND [DATE_REALISATION] IS NOT NULL;
SET @n = @@ROWCOUNT;
END;
Symptôme : la migration passe en recette (2 minutes) et bloque la production plusieurs heures. Cause : volume 100× supérieur, verrou de table, croissance du journal. Remède : mesurer sur un environnement volumétrique ; prévoir fenêtre, découpage, et un plan d'interruption (on peut arrêter sans corrompre). Mentionner le temps estimé dans les notes de version.
🔴 Expert — la volumétrie comme dimension de conception de pipeline#
Quand le temps de traitement devient contraignant, les leviers sont d'abord algorithmiques (réduire les données traitées : chargement incrémental plutôt que complet, partitionnement, index adaptés, éviter les fonctions scalaires par ligne) avant d'être matériels. Chaque levier a son prix en complexité : le chargement incrémental exige une fiabilité du suivi des changements (une ligne modifiée à la source mais non détectée est une erreur silencieuse) ; il se combine avec un rechargement complet périodique de contrôle. Les mesures de temps sont sensibles à l'environnement partagé (ressources variables) : mesurer en temps CPU, répéter, ne pas comparer deux exécutions simultanées. Voir Performance et volumétrie.
8. dbt et la transformation en code#
🟢 Novice — ce que c'est#
dbt (data build tool) est un outil qui permet d'écrire les transformations de données sous forme de requêtes SQL (des « modèles ») versionnées dans un dépôt, avec dépendances automatiquement déduites, tests déclaratifs (unicité, non-nullité, relation, valeurs acceptées) et documentation générée (dont le graphe de lignage). Il s'exécute dans l'entrepôt de données (approche ELT) : dbt orchestre le SQL, il ne déplace pas les données.
🟡 Pratique — ce qu'il apporte au CI/CD data#
| Capacité | Apport |
|---|---|
Modèles en SQL + ref() |
Graphe de dépendances ; ordre d'exécution calculé ; lignage |
| Tests déclaratifs | unique, not_null, relationships, accepted_values ; tests personnalisés |
| Environnements via profils | Même code, cibles dev/test/prod |
| Exécution partielle (état) | Ne reconstruire que ce qui a changé (« slim CI ») |
| Documentation générée | Catalogue de colonnes, lignage |
| Matérialisations | Vue, table, incrémental, instantané (historisation type SCD2) |
Exemple de test déclaratif :
models:
- name: fact_visite
columns:
- name: visite_id
tests: [unique, not_null]
- name: commercial_id
tests:
- relationships: { to: ref('dim_commercial'), field: commercial_id }
Pertinence pour SQL Server : des adaptateurs existent pour SQL Server, Azure SQL, Fabric Warehouse (état 2026-10, à vérifier pour votre version et la maturité de l'adaptateur correspondant) ; l'orchestration dans Fabric ou Azure DevOps est possible. Une alternative sans dbt reste valable : des procédures stockées versionnées avec un orchestrateur maison + tests SQL (voir section 5). dbt n'est pas obligatoire ; ses idées (graphe, tests déclaratifs, environnements, documentation) le sont davantage.
Même sans dbt, reprenez deux idées : tests déclaratifs attachés à chaque colonne clé et graphe de dépendances explicite entre transformations. Tout script qui connaît ses entrées et ses sorties se teste et se lignifie mieux.
🔴 Expert — limites de dbt#
- Son modèle suppose des transformations en SQL pur ; les traitements procéduraux complexes (curseurs, SQL dynamique, boucles) s'adaptent mal.
- La gestion des schémas persistants (index, partitions, droits, objets non gérés) est limitée : il crée des tables, il ne remplace pas un projet de base de données pour l'infrastructure.
- Compétence supplémentaire à acquérir (Jinja, packages) ; en équipe SQL Server traditionnelle, le bénéfice dépend de la taille du graphe de transformations (à partir de quelques dizaines de modèles, le gain devient net — ordre de grandeur indicatif).
9. Pipelines Fabric et Data Factory#
🟢 Novice — orchestrer les mouvements de données#
Un pipeline de données (Azure Data Factory, ou Data Factory dans Microsoft Fabric) orchestre des activités : copie, appel de notebook, procédure stockée, flux de données, conditions et boucles, avec déclencheurs planifiés ou événementiels. Il est lui-même un artefact à versionner et déployer — un pipeline modifié dans l'interface sans versionnement est du code de production sans historique.
🟡 Pratique — CI/CD dans Fabric (état 2026-10)#
Fabric propose deux mécanismes complémentaires :
- Intégration Git : un espace de travail (workspace) est relié à une branche d'un dépôt (Azure DevOps ou GitHub) ; les éléments sont sérialisés en fichiers, la validation (commit) et la mise à jour (update) se font depuis l'interface ou par API.
- Pipelines de déploiement : promotion de contenus d'un espace de travail à l'autre (développement → test → production) avec règles de déploiement (par exemple, changer la source de données par étape).
Chaque espace de travail correspond à un environnement. Les éléments pris en charge évoluent vite (état 2026-10 : la prise en charge des éléments Data Factory, notamment les pipelines de données, est documentée ; d'autres éléments restent en préversion ou partiels) — vérifiez la liste des éléments pris en charge sur la documentation Microsoft Learn avant de concevoir. Pour l'automatisation complète, la bibliothèque fabric-cicd (Python, maintenue par Microsoft ; état à vérifier) et les API REST Fabric permettent de scripter le déploiement depuis Azure DevOps ou GitHub Actions.
| Besoin | Option |
|---|---|
| Équipe BI avec peu d'automatisation | Intégration Git + pipelines de déploiement intégrés |
| Contrôle fin, approbations, multi-éléments | Scripts d'automatisation (fabric-cicd / API) dans Azure DevOps |
| Paramétrer par environnement | Variables/paramètres de déploiement, bibliothèques de variables (selon éléments) |
Symptôme : après promotion, le pipeline en production lit toujours la source de développement. Cause : connexion et paramètres codés en dur dans l'élément. Remède : externaliser connexions et paramètres (règles de déploiement, variables), et inclure un test de connectivité post-déploiement.
Symptôme : un pipeline fonctionne par « glisser-déposer » en développement mais le déploiement automatique échoue. Cause : dépendances implicites entre éléments (ordre de création), éléments non pris en charge, identifiants d'objets propres à l'espace de travail. Remède : déployer par script avec ordre explicite, tester la chaîne complète sur un espace de test vierge régulièrement.
🔴 Expert — idempotence d'un pipeline d'orchestration#
Un pipeline qui copie des données doit être rejouable : copie vers une zone de transit puis chargement idempotent (section 3), paramètre de fenêtre temporelle passé à l'exécution, table de contrôle des lots (watermark), gestion des échecs partiels (relance de l'activité en échec seulement). Les SaaS sources imposent quotas et pagination : un rejeu massif peut dépasser les limites d'API — prévoir le plafonnement et le reprise à partir du dernier curseur. Pour l'architecture Fabric/OneLake, voir 04 Reporting Power BI, architecture OneLake et difficultés et pièges.
10. Rapports Power BI : PBIP, TMDL, deployment pipelines#
🟢 Novice — un rapport est aussi du code#
Historiquement, un rapport Power BI était un fichier binaire (.pbix) : impossible à comparer, à fusionner, à relire. Le format projet Power BI (PBIP) décompose le rapport et le modèle sémantique en fichiers texte dans un dossier, donc versionnables par Git (ou TFVC). Le modèle sémantique se décrit en TMDL (Tabular Model Definition Language), un format texte lisible, indenté, un fichier par table, bien adapté aux différences et aux revues. Le rapport lui-même se sérialise au format PBIR (une définition par page et visuel, en JSON).
MonRapport.pbip
MonRapport.SemanticModel/
definition/
model.tmdl
tables/
FACT_VISITE.tmdl
DIM_COMMERCIAL.tmdl
relationships.tmdl
cultures/ fr-FR.tmdl ...
MonRapport.Report/
definition/
pages/ ... visuals/ ...
(état 2026-10 : PBIP, TMDL et PBIR sont les formats de développement de référence ; vérifier le statut GA/préversion de chaque composant et de la fonctionnalité de rapport PBIR sur la documentation Microsoft actuelle.)
🟡 Pratique — ce que le texte permet#
| Capacité | Bénéfice |
|---|---|
| Diff et revue de code | « Cette mesure a changé de formule » est lisible en revue |
| Fusion de branches | Deux développeurs modifient deux tables : les fichiers distincts fusionnent proprement |
| Historique | Qui a changé quelle mesure, quand, pourquoi |
| Déploiement automatisé | Publication du modèle via XMLA/API, ou via l'intégration Git de l'espace de travail |
| Contrôles automatiques | Validation de syntaxe, règles de bonnes pratiques (analyse du modèle), détection de clés ou de noms interdits |
| Édition par script | Modifier les mesures en lot via des scripts TMDL ou des outils d'édition de modèle |
Chaîne type :
Pipelines de déploiement Power BI/Fabric : promouvoir un contenu d'une étape à l'autre en conservant les liens ; les règles de déploiement substituent la source de données et les paramètres selon l'étape (par exemple, la base de développement devient la base de production). Les comparaisons entre étapes (« qu'est-ce qui diffère ? ») aident à la revue.
Ne jamais publier un rapport depuis le poste d'un développeur vers la production. Passer par le dépôt et la promotion contrôlée ; le poste ne sert qu'au développement.
Symptôme : la fusion de deux branches produit un modèle qui ne s'ouvre plus dans Power BI Desktop. Cause : conflit manuel mal résolu, métadonnées dupliquées (par exemple deux colonnes marquées comme clé dans une même table, identifiants techniques dupliqués), indentation TMDL cassée. Remède : valider la syntaxe et la cohérence par un contrôle automatique avant fusion et avant ouverture ; régler la résolution de conflits (ne pas fusionner à l'aveugle des fichiers générés) ; ne pas supprimer/recréer une mesure (le lien avec les rapports qui la consomment repose sur ses identifiants) — la modifier en place.
Symptôme : après un renommage de colonne dans le modèle, des visuels de rapports clients affichent des erreurs. Cause : les rapports référencent les noms ; le modèle est une interface publique. Remède : considérer noms de colonnes et de mesures comme une API versionnée ; renommer = changement majeur annoncé ; conserver le nom du datamart pour les colonnes (pas d'alias dans la couche sémantique).
🔴 Expert — limites et subtilités#
- Les données ne sont pas dans le projet : promouvoir le modèle ne déplace pas les données ; un rafraîchissement est nécessaire en destination, avec sa propre durée et ses éventuels échecs.
- Droits et sécurité (RLS) : les rôles de sécurité font partie du modèle ; tester la sécurité par rôle dans le pipeline (requêtes exécutées sous identité de rôle) est un contrôle d'intégrité essentiel. Voir Sécurité RLS et accès.
- Multilingue : les traductions (cultures) sont des fichiers texte comme les autres ; elles se génèrent depuis une source de métadonnées et se valident (aucune clé manquante). Voir Accessibilité et multilingue.
- Modes de stockage : Import, DirectQuery, Direct Lake, composite — le déploiement et le test varient (en Direct Lake, la dépendance aux éléments Fabric sous-jacents impose de déployer dans le bon ordre ; à vérifier selon l'état de la fonctionnalité). Voir 10 Bonnes pratiques Power BI transverses et 11 Checklist de projet reporting.
- Édition en ligne vs dépôt : modifier un modèle directement dans le service crée une dérive par rapport au dépôt ; décider qui fait foi (le dépôt) et verrouiller l'édition en production.
11. Rollback impossible sur la donnée#
🟢 Novice — on ne « dé-charge » pas facilement#
Revenir en arrière sur du code, c'est redéployer l'ancienne version. Revenir en arrière sur de la donnée, c'est restaurer un état antérieur… et perdre tout ce qui s'est produit depuis. Trois situations :
| Situation | Retour arrière ? | Stratégie |
|---|---|---|
| Objet sans données (vue, procédure) | Oui, facile | Redéployer la version précédente |
| Ajout de colonne/table | Oui, souvent (la colonne est ignorée ou supprimée) | Migration inverse écrite et testée |
| Suppression, transformation, fusion de données | Non, sauf restauration | Sauvegarde, copie de sécurité, expand/contract |
| Chargement incorrect de faits | Oui, si idempotence et source rejouable | Rejouer la tranche corrigée |
| Écriture vers un système externe (envoi, publication) | Non | Prévention : approbation, mode « à blanc » |
🟡 Pratique — les parades#
- Expand/contract (parallel change) : on ajoute le nouveau (colonne, table) sans supprimer l'ancien, on bascule les consommateurs, on supprime l'ancien dans une version ultérieure, quand plus rien ne le lit. Le retour arrière reste possible pendant toute la phase intermédiaire.
- Sauvegarde vérifiée avant les opérations destructrices : une sauvegarde restaurée en test est une sauvegarde ; une sauvegarde jamais restaurée est un espoir.
- Copie de sécurité ciblée :
SELECT * INTO [archive].[VISITE_20261007] FROM [dbo].[VISITE]avant migration lourde (volume permettant). - Table temporelle (system-versioned temporal table) de SQL Server pour retrouver l'état passé de certaines tables : utile, mais pas une sauvegarde (coût de stockage, rétention).
- Instantané / clone quand la plateforme le permet (à vérifier selon la plateforme : Azure SQL, Fabric Warehouse offrent des fonctions de restauration à un instant et de clonage ; les limites varient).
- Roll-forward : corriger par une migration corrective plutôt que revenir en arrière.
Dans chaque note de version, une section « Réversibilité » : ce qui peut être annulé, comment, en combien de temps, ce qui ne le peut pas. C'est l'équivalent data de la liste des risques d'une opération chirurgicale.
Symptôme : après une migration ratée, on découvre que la sauvegarde date de 3 jours et que 3 jours de saisies terrain ont été perdus. Cause : plan de repli supposé, jamais réellement calculé (RPO/RTO). Remède : définir la perte de données acceptable (RPO) et le délai de reprise (RTO) avant l'opération ; faire une sauvegarde juste avant ; geler les écritures pendant la fenêtre si nécessaire.
🔴 Expert — réversibilité comme critère d'architecture#
Concevoir pour la réversibilité : ne jamais écraser, toujours ajouter (tables de faits en ajout avec versions, historisation), séparer la zone brute (immuable, rejouable) de la zone transformée (reconstructible). Si la zone brute est conservée, tout ce qui en dérive est recalculable : le rollback devient « recalculer depuis le brut avec la version précédente du code ». C'est l'argument le plus fort en faveur d'une couche de données brutes conservées ; son coût (stockage, RGPD : durée de conservation, droit à l'effacement) doit être arbitré avec le DPO. Voir Sources et contrats de données.
12. Qualité continue en production#
🟢 Novice — le pipeline ne s'arrête pas au déploiement#
En CI/CD classique, la production est surveillée pour des pannes. En data, la production est surveillée pour des dégradations silencieuses : le chargement réussit, mais les données sont fausses ou en retard. D'où la qualité continue : des contrôles automatiques à chaque exécution de la chaîne de production.
🟡 Pratique — les cinq piliers d'observabilité des données#
| Pilier | Question | Exemple de contrôle |
|---|---|---|
| Fraîcheur | Les données sont-elles à jour ? | Dernière date chargée = J-1 avant 7 h |
| Volume | La quantité est-elle plausible ? | Lignes du jour vs moyenne glissante |
| Schéma | La structure a-t-elle changé ? | Colonne source supprimée, type modifié |
| Distribution | Les valeurs ont-elles la forme attendue ? | Part de NULL, répartition par statut |
| Lignage / impact | Qui consomme cette table ? | Rapports impactés par un retard |
Publiez dans les rapports un indicateur de fraîcheur (« Données au 2026-10-06, chargement terminé à 06:42 ») : l'utilisateur sait si le chiffre est à jour, et les litiges baissent.
Boucle de qualité continue :
🔴 Expert — le coût du bruit et le contrat de service#
- Fatigue d'alerte : trop d'alertes → plus personne ne lit. Règle : chaque alerte doit mener à une action ; sinon on la supprime ou on la rétrograde. Mesurer le taux d'alertes actionnables.
- SLO de données : « le datamart est disponible à 7 h, 99 % des jours ouvrés » est un engagement mesurable ; la fraîcheur devient un indicateur de service. Voir Exploitation et support et Exploitation, supervision et capacité.
- Journal de traitement (table de suivi des exécutions : lot, début, fin, lignes, statut, message d'erreur) : base de toute analyse de performance et d'incident ; la même table sert à la reprise.
13. Limites propres à la data#
🟢 Novice — ce que le CI/CD ne résout pas ici#
Aux limites générales du CI/CD (10 CI/CD, section 8) s'ajoutent des limites propres à la donnée :
| Limite | Explication | Parade |
|---|---|---|
| L'état n'est pas versionné comme le code | Le dépôt contient le schéma, pas les données ; une même version de code sur deux états donne deux comportements | Jeux de test versionnés, instantanés, tests sur plusieurs états de départ |
| Environnements irréalistes | Données de test différentes de la réalité ; cas limites absents | Anonymisation de production, jeu « doré » enrichi à chaque incident |
| Volumétrie | Tests sur petit jeu ne prédisent pas la durée réelle | Test de charge périodique |
| Rollback | Voir section 11 | Expand/contract, sauvegarde, roll-forward |
| Tests incomplets par nature | On ne peut pas tester toutes les données ; la qualité dépend de ce qui arrive demain | Contrôles en production, pas seulement avant |
| Vérité métier | Un test ne dit pas si la définition est juste | Recette métier sur chiffres, glossaire |
| Dépendances externes | Sources SaaS, API, quotas, schémas qui dérivent | Contrats de données, tests de contrat, supervision de schéma |
| Réglementation et données personnelles | Environnements de test soumis au RGPD | Anonymisation, droit d'accès restreint, durée de conservation |
| Compétences | SQL, modélisation, DevOps, métier : rarement chez une seule personne | Équipes pluridisciplinaires, montée en compétence progressive |
| Temps long | Un chargement de plusieurs heures ralentit le feedback | Environnement réduit pour CI, nuit pour charge complète |
🟡 Pratique — arbitrer l'investissement#
Le gain marginal du CI/CD data est maximal là où il y a : plusieurs environnements, plusieurs versions en parallèle, livraisons répétées, incidents d'installation passés, rotation d'équipe. Il est minimal pour un traitement unique et stable, un prototype, ou un environnement sans valeur de reprise. Évaluez en heures perdues par mois aujourd'hui (installations, corrections, attentes) contre le coût de mise en place.
Une équipe passe en moyenne 1 journée-personne par livraison (mensuelle) en installation et vérification manuelles sur 3 environnements, plus 2 incidents d'installation par trimestre (chacun 1 à 2 jours). Soit environ 16 à 20 jours-personne par an de coût « visible ». Automatiser l'installation sur recette et les vérifications de base peut coûter 10 à 20 jours une fois, plus l'entretien : l'arbitrage est favorable sur deux ans, et surtout la prévisibilité s'améliore. (Chiffres illustratifs ; faites votre propre calcul.)
🔴 Expert — dérive des sources et contrats#
Les sources SaaS ou applicatives changent sans prévenir : colonne ajoutée, type modifié, valeur d'énumération nouvelle. Le pipeline doit détecter (comparaison de schéma, contrôles de domaine), isoler (zone d'atterrissage tolérante, transformations strictes) et alerter — le contrat de données (schéma, sémantique, SLA) transforme la surprise en changement géré. Voir Sources et contrats de données et Difficultés et pièges SQL Server SaaS.
14. Notes de maturité des pratiques#
Appréciations d'expert, contextuelles (équipe de 3 à 8 personnes, datamart SQL Server/Azure SQL, rapports Power BI, livraison en kits, état 2026-10). Voir NOTATION. Trois colonnes : valeur apportée, effort de mise en place (5 = très élevé), maturité de l'écosystème d'outils.
| Pratique | Valeur | Effort | Maturité outils | Commentaire |
|---|---|---|---|---|
| Scripts SQL versionnés (tout le schéma) | 5/5 | 2/5 | 5/5 | Préalable absolu |
| Projet de base de données + dacpac | 4/5 | 3/5 | 5/5 | Excellent pour objets sans données ; courbe sur les renommages |
| Migrations versionnées pour tables à données | 5/5 | 3/5 | 4/5 | Indispensable dès qu'on transforme des données |
| Scripts idempotents et rejouables | 5/5 | 3/5 | 4/5 | Discipline, pas outil |
| Journal d'installation / de traitement | 5/5 | 2/5 | 4/5 | Sous-estimé, bénéfices énormes |
| Kit d'installation automatisé et vérifié | 5/5 | 3/5 | 3/5 | Peu d'outils standard : surtout de l'ingénierie maison |
| Matrice de test de montée de version | 4/5 | 4/5 | 3/5 | Coûteuse, très rentable avec versions parallèles |
| Tests unitaires de transformations SQL | 3/5 | 4/5 | 3/5 | Effort d'écriture ; réservé aux règles à risque |
| Tests de données à chaque chargement | 5/5 | 2/5 | 4/5 | Premier pas DataOps recommandé |
| Non-régression de chiffres témoins | 5/5 | 3/5 | 2/5 | Peu outillé en standard ; scripts maison |
| Anonymisation de la production pour recette | 4/5 | 4/5 | 3/5 | Valeur forte, risque conformité à maîtriser |
| Test de charge volumétrique périodique | 4/5 | 3/5 | 3/5 | Évite les mauvaises surprises |
| dbt (ou équivalent) | 3/5 | 3/5 | 4/5 | Pertinent si beaucoup de modèles SQL en ELT |
| Intégration Git Fabric + pipelines de déploiement | 4/5 | 3/5 | 3/5 | Couverture des éléments en évolution rapide |
| PBIP/TMDL en dépôt + contrôles automatiques | 5/5 | 3/5 | 3/5 | Révolutionne la revue ; outils de validation à compléter |
| Tests DAX de non-régression | 4/5 | 4/5 | 2/5 | Peu de standard, forte valeur |
| Rollback automatique de la donnée | 1/5 | 5/5 | 2/5 | Illusoire ; préférer expand/contract et rejeu |
| Qualité continue en production (fraîcheur, volume, schéma) | 5/5 | 3/5 | 3/5 | Détecte les pannes silencieuses |
| Déploiement continu automatique en production | 2/5 | 4/5 | 3/5 | Rare et peu souhaitable en data client ; préférer la livraison continue |
Lecture : les meilleurs rapports valeur/effort sont versionner, idempoter, journaliser, tester les données à chaque chargement, automatiser le déploiement en recette. Les pratiques les plus tendance (dbt, déploiement continu, rollback automatique) sont moins prioritaires que ces fondamentaux.
15. Contribution de l'IA#
| Cas d'usage | Gain | Risque | Maturité | Prérequis | Garde-fous |
|---|---|---|---|---|---|
| Rédiger des scripts de migration idempotents | 4/5 | 3/5 | 4/5 | Schéma, conventions, exemples | Relecture ; exécution sur copie ; ne jamais lancer en production directement |
| Générer des tests de données depuis un schéma | 4/5 | 2/5 | 4/5 | Dictionnaire de données | Règles métier validées par le propriétaire |
| Proposer des requêtes témoins de réconciliation | 3/5 | 3/5 | 3/5 | Liste d'indicateurs et définitions | Valider les définitions ; tolérances décidées par l'humain |
| Expliquer un delta de déploiement (script SqlPackage) | 4/5 | 2/5 | 4/5 | Script de delta | Vérifier les opérations destructrices soi-même |
| Générer des données de test synthétiques (cas limites) | 3/5 | 2/5 | 3/5 | Description des cas | Vérifier la couverture réelle ; pas de données personnelles dans le prompt |
| Revoir un diff TMDL / une mesure DAX | 3/5 | 3/5 | 3/5 | Fichiers texte du modèle | Relecture humaine ; test de non-régression |
| Écrire un pipeline YAML de déploiement | 4/5 | 3/5 | 4/5 | Modèle de référence | Relecture sécurité (secrets, droits) |
| Diagnostiquer un échec d'installation à partir du journal | 4/5 | 2/5 | 4/5 | Journal sans secret | Vérifier avant d'agir |
L'IA excelle à produire rapidement des scripts plausibles ; en data, « plausible » est dangereux : une migration qui paraît correcte peut supprimer des données ou doubler des lignes. Règle : tout ce qui écrit (migration, correctif, purge) est relu par un humain, rejoué sur une copie, et accompagné d'un plan de repli. Ne jamais envoyer de données personnelles réelles. Détail : 12 IA et conduite de projet.
Prompt d'exemple :
Voici le schéma actuel de la table [dbo].[VISITE] et la modification souhaitée (ajout d'une colonne STATUT_COD
avec valeur par défaut calculée depuis DATE_REALISATION). Écris un script T-SQL IDEMPOTENT :
- vérifie l'existence avant de modifier ;
- fait le backfill par tranches de 50 000 lignes ;
- ne contient aucune instruction destructrice ;
- se termine par une requête de contrôle (nombre de lignes à NULL).
Liste ensuite les risques (verrous, journal, compatibilité avec la version précédente du code) et le plan de repli.
16. Voir aussi#
- Socle : 10 CI/CD · 07 Méthodes spécifiques data · 04 Scrum et data · 13 Pièges et bonnes pratiques
- Outils : GDS et données SQL/BI · Git vs TFVC · Azure DevOps / TFS
- Matrices : Conduite de projet data · Développement BI · Intégration et livraison continues
- Reporting : 04 Reporting Power BI · OneLake architecture · SQL Server SaaS architecture
- Glossaire · Bibliographie
✻ Rédigé par Claude Sonnet 5.5