clement13.net
Photo d’origine : Un long pipeline traversant une vallée de montagne
Description
Un long pipeline traversant une vallée de montagne
Source
U.S. Geological Survey · page d’origine
Licence
CC0 Domaine public
Photo d’origine, non retouchée. L’arrière-plan en est une version stylisée par le site.

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…

Guide≈ 38 min de lectureVérifié en partieContrôle partielLes faits principaux ont été contrôlés par recherche dans des sources citées. Les éléments ci-dessous restent à recontrôler avant de s’y fier.À recontrôler
  • Statut GA/préversion actuel de PBIP, PBIR et Direct Lake non confirmé sur Learn (déjà formulé avec réserve dans la page).
  • Maturité actuelle des adaptateurs dbt (dbt-fabric, dbt-sqlserver) et de tSQLt non confirmée pour 2026-10 (déjà signalée « à vérifier »).
Rédaction assistée par IA ; sources citées en bas de page. Une erreur ? Signalez-la via le site clement13.net.
Lecture
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. 1. Ce qui change quand le produit contient de la donnée
    1. 🟢 Novice — le code est jetable, la donnée non
    2. 🟡 Pratique — ce qui reste identique
    3. 🔴 Expert — trois couches à déployer, trois rythmes
  2. 2. Versionner une base : état ou migrations
    1. 🟢 Novice — deux façons de décrire une base en code
    2. 🟡 Pratique — forces et faiblesses
    3. 🔴 Expert — l'approche hybride, la plus fréquente en entreprise
  3. 3. Idempotence, rejeu et reprise
    1. 🟢 Novice — pourquoi tout doit pouvoir être rejoué
    2. 🟡 Pratique — patrons d'idempotence
    3. 🔴 Expert — MERGE, déterminisme et fenêtres de rejeu
  4. 4. Déploiement en kits d'installation
    1. 🟢 Novice — pourquoi des « kits »
    2. 🟡 Pratique — anatomie d'un bon kit
    3. 🔴 Expert — compatibilité entre versions de kit
  5. 5. Tester les données et les transformations
    1. 🟢 Novice — quatre familles de tests
    2. 🟡 Pratique — des tests de transformation sur jeux contrôlés
    3. 🔴 Expert — la non-régression de chiffres
  6. 6. Environnements, données réalistes et anonymisées
    1. 🟢 Novice — le dilemme
    2. 🟡 Pratique — anonymiser sans casser les tests
    3. 🔴 Expert — conformité et responsabilité
  7. 7. Volumétrie et temps de traitement
    1. 🟢 Novice — le test sur « 1 000 lignes » ne prouve rien sur 100 millions
    2. 🟡 Pratique — les mesures à intégrer
    3. 🔴 Expert — la volumétrie comme dimension de conception de pipeline
  8. 8. dbt et la transformation en code
    1. 🟢 Novice — ce que c'est
    2. 🟡 Pratique — ce qu'il apporte au CI/CD data
    3. 🔴 Expert — limites de dbt
  9. 9. Pipelines Fabric et Data Factory
    1. 🟢 Novice — orchestrer les mouvements de données
    2. 🟡 Pratique — CI/CD dans Fabric (état 2026-10)
    3. 🔴 Expert — idempotence d'un pipeline d'orchestration
  10. 10. Rapports Power BI : PBIP, TMDL, deployment pipelines
    1. 🟢 Novice — un rapport est aussi du code
    2. 🟡 Pratique — ce que le texte permet
    3. 🔴 Expert — limites et subtilités
  11. 11. Rollback impossible sur la donnée
    1. 🟢 Novice — on ne « dé-charge » pas facilement
    2. 🟡 Pratique — les parades
    3. 🔴 Expert — réversibilité comme critère d'architecture
  12. 12. Qualité continue en production
    1. 🟢 Novice — le pipeline ne s'arrête pas au déploiement
    2. 🟡 Pratique — les cinq piliers d'observabilité des données
    3. 🔴 Expert — le coût du bruit et le contrat de service
  13. 13. Limites propres à la data
    1. 🟢 Novice — ce que le CI/CD ne résout pas ici
    2. 🟡 Pratique — arbitrer l'investissement
    3. 🔴 Expert — dérive des sources et contrats
  14. 14. Notes de maturité des pratiques
  15. 15. Contribution de l'IA
  16. 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 :

Rapports / modèle sémantiquerythme élevé · retour arrière facile (versions du fichier)Transformations / procéduresrythme moyen · retour arrière = redéploiement + recalculSchéma + données persistantesrythme faible · risque maximal · retour arrière souvent impossible
Plus on descend, plus le risque monte et plus le retour arrière devient difficile.Survolez ou touchez un élément pour en lire le détail.

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).

⚠️ Piège

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é.

⚠️ Piège

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 :

  1. É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.
  2. Migrations pour les tables à données : ajout de colonne avec valeur par défaut, scission, fusion, transformation de type, backfill.
  3. Un journal d'application (table dbo._SchemaHistory ou é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.

💡 Astuce d'expert

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;
✅ Bonne pratique

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).

⚠️ Piège

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#

  • MERGE de SQL Server : puissant mais historiquement entouré de défauts documentés ; pour les cas critiques, beaucoup d'équipes préfèrent les instructions explicites UPDATE puis INSERT (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é (TOP sans ORDER 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 :

  1. Le kit se construit dans le pipeline, pas à la main : un artefact unique, signé ou empreinté, publié avec sa version.
  2. 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.
  3. Le kit contient son propre test : un script de contrôle qui rapporte « installé et conforme » ou la liste des écarts.
⚠️ Piège

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.)

✅ Bonne pratique

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=False et le paramétrage non destructif.
🧪 Exemple

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.

✅ Bonne pratique

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.

⚠️ Piège

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.
⚠️ Piège

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.

⚠️ Piège

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.

💡 Astuce d'expert

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;
⚠️ Piège

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.

✅ Bonne pratique

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)
⚠️ Piège

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.

⚠️ Piège

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 :

PBIP en dépôtContrôle de syntaxeet règles de modèleDéploiementespace DEVRequêtes DAX témoinsnon-régression de chiffresPromotionTESTValidationmétierPROD
Survolez ou touchez un élément pour en lire le détail.

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.

✅ Bonne pratique

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.

⚠️ Piège

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.

⚠️ Piège

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#

  1. 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.
  2. 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.
  3. Copie de sécurité ciblée : SELECT * INTO [archive].[VISITE_20261007] FROM [dbo].[VISITE] avant migration lourde (volume permettant).
  4. 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).
  5. 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).
  6. Roll-forward : corriger par une migration corrective plutôt que revenir en arrière.
✅ Bonne pratique

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.

⚠️ Piège

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
✅ Bonne pratique

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 :

ChargementContrôlesautomatiquesJournalrésultats, duréeTableau de bord qualitétendanceRevue mensuelleNouvelles règles /suppression du bruitAlerte(propriétaire)CorrectionRejeu idempotentanomalie
Survolez ou touchez un élément pour en lire le détail.

🔴 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.

🧪 Exemple

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
🤖 IA

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#

✻ Rédigé par Claude Sonnet 5.5