clement13.net
Photo d’origine : Coffre-fort ancien en bois précieux, renforcé de ferrures de laiton ouvragées.
Description
Coffre-fort ancien en bois précieux, renforcé de ferrures de laiton ouvragées.
Source
14GTR · 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.

Gestion de source pour les données : SQL et Power BI

Versionner des objets SQL de façon rejouable : scripts idempotents, state-based contre migration-based, SSDT/dacpac, Flyway, Liquibase.

Guide≈ 16 min de lectureVérifiéContrôle effectuéLes faits, chiffres et références ont été contrôlés au regard des sources citées dans la fiche.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
  • Versionner des objets SQL de façon rejouable : scripts idempotents, state-based contre migration-based, SSDT/dacpac, Flyway, Liquibase.
  • Versionner Power BI de manière fusionnable : PBIP, PBIR, TMDL, diffs et fusions, pièges des binaires.
  • Maîtriser encodages, BOM, fins de ligne et .gitattributes pour ne jamais corrompre un accent.
  • Gérer gros fichiers, secrets, données de référence, kits d'installation et tags de release.
  • Savoir où l'IA aide (diff de schéma, documentation, revue) et où elle est dangereuse.

Fil rouge illustratif : un datamart SQL Server alimenté par une application de force de vente terrain, avec rapports Power BI multilingues, livré en kits d'installation.

Sur cette page

Niveau : 🟡→🔴

Ce qui change avec les données#

🟡 Niveau pratique

Versionner du code applicatif est « sans état » : on remplace les binaires. Versionner une base de données est différent : la base contient un état (tables remplies, historiques, paramétrages client) qu'on ne peut pas remplacer. Il faut donc versionner la manière d'évoluer (migrations) autant que la cible. Trois conséquences :

  1. Chaque modification doit être rejouable sur un environnement existant (idempotence, non destructivité).
  2. Deux branches qui modifient la même table produisent des migrations conflictuelles par l'ordre, sans conflit de fichiers.
  3. Les rapports et le modèle sémantique consomment le schéma : le versionnement doit lier les couches (monorepo, PR coordonnées, tags communs).

Voir aussi CI/CD pour la data et la matrice Versionnement et industrialisation des rapports.

Ce que l'on versionne#

🟡 Niveau pratique

Catégorie Exemples Format Qualité de diff/fusion
Schéma et programmes SQL Tables, vues, procédures, fonctions .sql texte Excellente
Données de référence Paramètres, listes, libellés multilingues .sql (MERGE), .csv Bonne si triée et stable
Modèle sémantique Tables, mesures DAX, relations TMDL (texte) Bonne
Définition de rapport Pages, visuels PBIR (JSON) Moyenne (verbeux, identifiants)
Rapport monolithique .pbix Binaire Nulle
Scripts d'orchestration PowerShell, YAML de pipelines Texte Excellente
Documentation Markdown Texte Excellente
Kits générés .zip, dossier d'installation Binaire/texte À ne pas versionner (régénérables) ou à archiver comme artefacts
✅ Bonne pratique

Versionner les sources, pas les produits dérivés. Un kit d'installation est généré depuis les sources ; on le garde comme artefact de build (stocké par le pipeline, adressé par version), pas comme fichier à fusionner. Exception : un snapshot de release figé quand l'archivage contractuel l'exige.

State-based et migration-based pour SQL#

🟡 Niveau pratique

Deux philosophies pour décrire l'évolution d'un schéma :

State-based (état cible) Migration-based (changements ordonnés)
Ce qu'on versionne La définition finale de chaque objet Une suite de scripts de changement numérotés
Génération du déploiement L'outil compare cible et base, génère le delta On rejoue les scripts non encore appliqués
Atouts Lisible (un fichier = un objet), diff naturel, pas de dérive d'ordre Contrôle exact (transformations de données), reproductible, adapté aux migrations complexes
Limites Le delta généré peut être destructeur (ex. renommage = drop/create), transformations de données non déduites Chaîne qui s'allonge, conflits d'ordre entre branches, lecture de l'état courant difficile
Outils SSDT/SqlPackage (dacpac), Redgate SQL Source Control Flyway, Liquibase, DbUp, EF migrations, Redgate Deploy
Notes /5 (équipe 5-15, datamart) Lisibilité 5, sûreté 3 Lisibilité 3, sûreté 5

Approche hybride fréquente et saine : état cible pour les objets sans état (vues, procédures, fonctions : CREATE OR ALTER), migrations pour les objets à état (tables : ajout de colonne, changement de type, backfill de données).

🧪 Exemple (datamart)

Dans un datamart recalculé à chaque consolidation, les tables de faits et dimensions sont reconstruites par des programmes : l'état cible (la définition du programme) est ce qu'on versionne, et la table est jetable. En revanche, une table de paramétrage ou de journal contient un état qu'il faut migrer sans perte : migration-based pour elle.

Scripts idempotents#

🟡 Niveau pratique

Un script est idempotent s'il peut être rejoué plusieurs fois avec le même résultat et sans erreur. C'est la condition d'un déploiement fiable sur des environnements dans des états différents.

-- Procédure : état cible
CREATE OR ALTER PROCEDURE [dm].[p_Exemple]
AS
BEGIN
    SET NOCOUNT ON;
    -- ...
END;
GO

-- Colonne : migration idempotente
IF COL_LENGTH('dm.DIM_CLIENT', 'CLI_SEGMENT') IS NULL
    ALTER TABLE [dm].[DIM_CLIENT] ADD [CLI_SEGMENT] nvarchar(20) NULL;
GO

-- Donnée de référence : MERGE
MERGE [dbo].[_Parametre] AS T
USING (VALUES (N'SEUIL_COUVERTURE', N'0.80')) AS S([Nom], [Valeur])
   ON T.[Nom] = S.[Nom]
WHEN NOT MATCHED THEN INSERT ([Nom], [Valeur]) VALUES (S.[Nom], S.[Valeur]);
-- (pas de WHEN MATCHED UPDATE : ne pas écraser la personnalisation client)
GO

Règles :

  • Protéger avec IF EXISTS/IF NOT EXISTS ou CREATE OR ALTER ; éviter DROP non gardé.
  • Ne pas écraser les valeurs personnalisées par le client : installation non destructive, séparer paramétrage standard et spécifique.
  • Ordre : numéroter les scripts (010_Core, 020_…) pour que l'ordre de rejeu soit déterministe.
  • Transactions : envelopper les changements de schéma à plusieurs étapes ; attention aux opérations DDL non transactionnelles.
  • Un script, un sujet ; commentaires d'en-tête (objet, version, tickets) mais pas de journal de corrections dans le corps : l'historique est dans la GDS.
⚠️ Piège

Le MERGE T-SQL comporte des cas limites connus (concurrence, doublons dans la source, triggers) ; testez, utilisez HOLDLOCK si concurrence, et dédupliquez la source.

Outils SSDT, dacpac, Flyway, Liquibase#

🔴 Niveau expert

Outil Modèle Notes Remarques
SSDT (projets SQL de Visual Studio) / projets SDK-style (Microsoft.Build.Sql) State-based 4/5 pour un projet SQL Server centré sur le schéma Compile le projet, détecte erreurs de référence à la compilation ; produit un dacpac
SqlPackage Déploiement dacpac 4/5 publish génère le delta ; options /p:BlockOnPossibleDataLoss=True, DropObjectsNotInSource : dangereuse à mal régler
Flyway Migration-based 4/5 Fichiers V1__nom.sql, table d'historique, versions repeatable R__ pour objets rejouables
Liquibase Migration-based (XML/YAML/SQL) 4/5 Changelog déclaratif, rollback, contextes
DbUp Migration-based (.NET) 3/5 Léger, intégré à du code C#
Redgate Les deux 4/5 Commercial
Scripts maison + kit Hybride 3/5 Souplesse maximale, exigence de discipline (ordre, idempotence, tests)

Choisir : un projet SSDT est le meilleur filet pour un schéma complexe (références vérifiées, comparaison cible/base) ; Flyway/Liquibase pour des équipes qui privilégient la migration explicite ; scripts maison quand le produit génère une grande partie du schéma par programmes (comme un datamart piloté par métadonnées) — à condition d'automatiser les contrôles (syntaxe, ordre, idempotence, test de rejeu à blanc).

# Exemple : déployer un dacpac en bloquant toute perte de données
sqlpackage /Action:Publish /SourceFile:Datamart.dacpac `
  /TargetConnectionString:"..." /p:BlockOnPossibleDataLoss=True /p:DropObjectsNotInSource=False
✅ Bonne pratique

Test de rejeu systématique : appliquer le kit sur (1) une base vide, (2) une copie de base d'un client existant ; comparer le schéma obtenu (sqlpackage /Action:DeployReport ou comparaison de schéma). Si les deux diffèrent, le script n'est pas idempotent.

Versionner Power BI (PBIP, PBIR, TMDL)#

🟡 Niveau pratique

Le fichier .pbix est un zip binaire : pas de diff, pas de fusion, historique opaque. Le format projet Power BI (PBIP) décompose l'artefact en dossiers texte :

MonRapport.pbip                      (pointeur)
MonRapport.SemanticModel/
    definition.pbism
    definition/
        model.tmdl
        relationships.tmdl
        tables/
            FAITS.tmdl
            CLIENT.tmdl
        cultures/
            fr-FR.tmdl  en-US.tmdl     (traductions)
MonRapport.Report/
    definition.pbir
    definition/
        report.json
        pages/
            pages.json
            <id-page>/page.json
            <id-page>/visuals/<id-visuel>/visual.json
  • TMDL (Tabular Model Definition Language) : syntaxe texte lisible du modèle sémantique (tables, colonnes, mesures DAX, relations, rôles RLS, cultures). Une table = un fichier ; les mesures sont lisibles ligne à ligne.
  • PBIR : format de définition de rapport en fichiers JSON (un visuel = un fichier) : diffs ciblés, fusion possible. Le format remplace l'ancienne définition monolithique report.json (PBIR-Legacy) : d'après la documentation Power BI (état 2026-10), PBIR est en disponibilité générale et constitue le format de rapport par défaut ; un rapport PBIR-Legacy modifié puis enregistré est converti automatiquement en PBIR.
  • Git intégré à Fabric / Power BI : synchronise un espace de travail avec un dépôt Git (Azure DevOps ou GitHub) ; sérialise dans ces formats. Pas de support TFVC : une raison supplémentaire de migrer pour un projet qui veut l'intégration native au service.
  • Les rapports clients liés à un modèle par identifiant : les lineageTag des mesures/colonnes assurent la continuité des rapports qui y sont connectés ; modifier une mesure en place (et jamais supprimer/recréer) préserve le lien. C'est un invariant à protéger par revue.
⚠️ Piège

Un même modèle sémantique ne doit pas être édité simultanément dans Desktop et par script/Tabular Editor sans synchronisation : Desktop réécrit les fichiers à l'enregistrement (ordre, mise en forme). Symptôme : diff énorme sans changement réel. Remède : une seule personne/outil à la fois, committer avant et après une session d'édition.

💡 Astuce d'expert

Depuis Desktop, enregistrez au type Power BI Project (.pbip) (Fichier → Enregistrer sous) et choisissez TMDL comme format du modèle sémantique ; PBIR est désormais le format de rapport par défaut. Contrôlez la validité par un validateur de syntaxe TMDL avant d'ouvrir (ou par Tabular Editor/outils CLI), car un fichier mal indenté empêche l'ouverture du projet.

Diffs et fusions de TMDL et de JSON de rapport#

🔴 Niveau expert

TMDL : indentation significative (comme YAML) et mesures multi-lignes. Les fusions échouent surtout par :

  • Indentation modifiée d'un côté (reformatage) → conflit sur tout le bloc.
  • Réordonnancement de colonnes/mesures par Desktop → diff bruyant.
  • Identifiants lineageTag générés : deux ajouts concurrents ne les mélangent pas, mais une copie d'objet duplique le tag (à renouveler).
  • Annotations internes (PBI_QueryRelationships, etc.) régénérées.

Parades : conventions de formatage uniques, éditer des blocs distincts (une personne par table), git diff --word-diff, résolution manuelle puis ouverture dans Desktop pour valider, et garder les fusions de modèle petites et fréquentes.

JSON de rapport (PBIR) : un visuel par fichier limite les conflits ; mais le positionnement (x, y, largeur) et les identifiants de pages changent dès qu'on déplace un objet. Sur un conflit, privilégier la version d'un seul côté (page entière) plutôt qu'une fusion fine.

git diff --word-diff=color -- "*.tmdl"
git diff --stat main...feature -- "*.Report/*"
# Outil de fusion : configurer un mergetool pour TMDL/JSON
git config merge.tool vscode
git config mergetool.vscode.cmd 'code --wait --merge $REMOTE $LOCAL $BASE $MERGED'
Aspect .pbix PBIP + TMDL + PBIR
Diff lisible 0/5 4/5
Fusion de deux éditions concurrentes 0/5 3/5
Revue de code (PR) 0/5 4/5
Facilité pour un utilisateur métier 5/5 3/5
Taille du dépôt 2/5 4/5
Adéquation CI/CD (validation, déploiement) 1/5 4/5

Contexte : équipe 3-15 personnes, rapports d'entreprise multilingues ; appréciations d'expert (NOTATION).

🧪 Exemple

Une migration de rapport vers un modèle de référence implique des centaines de fichiers JSON. En PBIP, la PR liste précisément les visuels modifiés ; un script de contrôle peut valider tous les champs référencés par chaque visuel contre le modèle avant la fusion. En .pbix, il faudrait ouvrir chaque fichier à la main.

Encodages, BOM et fins de ligne#

🔴 Niveau expert

Sujet vital pour du contenu multilingue accentué : une erreur d'encodage détruit les accents sans message d'erreur.

Encodage SSMS / sqlcmd par défaut sqlcmd -f 65001 PowerShell 5.1
UTF-8 avec BOM ✅ ✅ ✅
UTF-8 sans BOM ❌ mojibake ✅ ❌ mojibake
cp1252 / ISO-8859-1 ✅ ❌ (U+FFFD) ✅

Lecture : UTF-8 avec BOM est, pour les .sql et .ps1 exécutés sous Windows, le seul encodage décodé correctement dans tous les cas ; UTF-8 sans BOM est la norme attendue par d'autres outils (Node, Markdown/YAML, TMDL/JSON écrits par Power BI Desktop). Règle d'équipe : un encodage par type de fichier, documenté, vérifié automatiquement.

Type Encodage recommandé Raison
.sql, .ps1 UTF-8 avec BOM SSMS, sqlcmd, PowerShell 5.1
.tmdl, .pbir, .pbism, JSON de rapport UTF-8 sans BOM Écrits par Power BI Desktop, qui les réécrit
.md, .yml, .js UTF-8 sans BOM Un BOM avant le frontmatter YAML casse certains analyseurs
.bat, .cmd Page de code OEM/ANSI selon contenu Attention aux accents

Fins de ligne : LF dans le dépôt (normalisation) ; CRLF sur disque Windows si l'outil le veut. Les fichiers TMDL écrits par Desktop sont en CRLF.

.gitattributes type :

# Normalisation par défaut : texte détecté, LF dans le dépôt
* text=auto

# Sources SQL et PowerShell : texte
*.sql  text working-tree-encoding=UTF-8 eol=lf
*.ps1  text eol=lf

# Fichiers écrits par Power BI Desktop : ne pas modifier les fins de ligne
*.tmdl text eol=crlf
*.pbir text eol=crlf
*.json text

# Binaires : jamais touchés
*.pbix binary
*.zip  binary
*.png  binary
*.bak  binary

Remarques d'expert :

  • working-tree-encoding convertit à la lecture/écriture (utile pour cp1252 ↔ UTF-8) mais ne gère pas le BOM à votre place : il faut contrôler la présence de BOM par un hook ou un script de validation.
  • Les fichiers *.sql « avec BOM » sont à détecter dans un pre-commit : lire les 3 premiers octets EF BB BF.
  • Sous TFVC, il n'y a pas de normalisation automatique ; l'encodage est celui du fichier stocké (propriété de type de fichier : encodage détecté au add). Un outil qui « réécrit » un fichier avec un autre encodage provoque un changeset parasite.
  • Ne jamais lire puis réécrire un fichier dont on ne connaît pas l'encodage avec un outil qui suppose UTF-8 : tous les accents du fichier sont corrompus, pas seulement la ligne éditée.
  • sed -i et certains outils suppriment les CR des fichiers CRLF : privilégier des traitements binaires (Python) ou l'éditeur du projet.
# Contrôle : tous les .sql ont-ils un BOM UTF-8 ?
Get-ChildItem -Recurse -Filter *.sql | ForEach-Object {
    $b = [System.IO.File]::ReadAllBytes($_.FullName) | Select-Object -First 3
    if (-not ($b[0] -eq 0xEF -and $b[1] -eq 0xBB -and $b[2] -eq 0xBF)) { $_.FullName }
}
# Écriture d'un fichier avec BOM
$enc = New-Object System.Text.UTF8Encoding $true
[System.IO.File]::WriteAllText($chemin, $contenu, $enc)
⚠️ Piège

Symptôme : libellés « Détail » après déploiement. Cause : fichier UTF-8 sans BOM exécuté par un outil qui le lit en ANSI (ou l'inverse). Un déploiement peut réussir (code retour 0) en corrompant tous les libellés. Remède : BOM sur les sources exécutées par sqlcmd/PowerShell, test de rejeu avec un libellé accentué témoin (ex. une valeur « Éléphant ç œ » relue après installation).

Gros fichiers et binaires#

🔴 Niveau expert

  • Ne pas versionner : sauvegardes .bak, exports massifs, caches Power BI (cache.abf), localSettings.json, dossiers bin/obj/node_modules.
  • .pbix inévitables (anciens rapports) : Git LFS (avec verrouillage), ou stockage d'artefacts hors dépôt ; mieux : les convertir en PBIP.
  • Jeux de données d'exemple : petits (quelques Mo) ; sinon, script générateur versionné plutôt que la donnée.
  • Taille d'historique : un binaire ajouté puis supprimé reste dans l'historique : git filter-repo pour purger (02).
  • TFVC accepte les binaires sans extension, mais la base de collection grossit ; surveiller.

Seuils d'ordre de grandeur (à adapter) : alerter à partir de ~10 Mo par fichier, refuser au-delà de ~100 Mo sans LFS (plafonds d'hébergeur à vérifier).

Secrets et données de référence#

🔴 Niveau expert

Secrets : chaînes de connexion, mots de passe, clés de stockage, jetons. Dans un projet data, ils se cachent dans : fichiers de configuration appsettings, scripts PowerShell de déploiement, paramètres de sources de données Power BI (expressions.tmdl avec serveur et base), pipelines. Règles : authentification intégrée/identités managées plutôt que mots de passe ; coffre pour le reste ; paramètres par environnement hors dépôt ; analyse de secrets à chaque PR (détails).

⚠️ Piège

Les noms de serveurs et de bases de production dans les fichiers TMDL ne sont pas des mots de passe, mais ils sont des informations sensibles (cartographie). Paramétrer par environnement (paramètres Power Query) plutôt que d'écrire des valeurs fixes.

Données de référence (paramètres, listes de valeurs, libellés traduits) :

  • Les versionner sous forme de scripts rejouables (MERGE sans écrasement du paramétrage client) ou de fichiers .csv triés et stables (colonnes dans un ordre fixe, tri par clé) pour un diff propre.
  • Ne pas versionner de données personnelles (RGPD) ; pour des jeux de test, anonymiser/synthétiser.
  • Séparer standard (livré, versionné) de personnalisé/projet (client, hors produit ou dans un dossier dédié) ; héritage et ordre de priorité documentés.
  • Traductions : fichier source unique (table de libellés), génération vers les cultures du modèle ; le diff des traductions doit être lisible (une ligne par clé et par langue).

Kits d'installation et tags de release#

🔴 Niveau expert

Un kit d'installation est l'ensemble ordonné des scripts (SQL, PowerShell) qui installe ou met à niveau le produit. Il se génère depuis les sources et se rejoue sur des environnements existants.

Invariants à garantir :

  1. Reproductibilité : le kit d'une version doit pouvoir être régénéré exactement depuis le tag correspondant.
  2. Ordre déterministe et idempotence (voir plus haut).
  3. Traçabilité : la version installée est inscrite dans la base (table de version) et dans le journal d'installation ; on relie version ↔ tag ↔ changeset/commit.
  4. Intégrité : somme de contrôle du kit ; signature du tag.
  5. Exécution fiable : les options d'exécution documentées (ex. sqlcmd -x -X pour désactiver substitution de variables et commandes) ; un kit qui « s'installe avec succès » en corrompant des accents ou en sautant des fichiers est pire qu'un échec franc : faire échouer bruyamment.

Tags de release :

git tag -s v9.1.2 -m "Kit 9.1.2 — correctifs consolidation"
git push origin v9.1.2
git describe --tags        # v9.1.2-3-gabc1234 : 3 commits après le tag
git archive --format=zip --prefix=kit-9.1.2/ v9.1.2 -o kit-9.1.2.zip

Sous TFVC : un changeset de référence documenté + branche de release + (éventuellement) label ; consigner le numéro de changeset dans les notes de livraison.

✅ Bonne pratique

Version sortie ≠ kit produit : tagger quand le kit est construit ; marquer « livré » seulement après documentation publiée et feu vert qualité. Gardez les deux événements distincts dans le registre de versions.

Organisation du dépôt#

🔴 Niveau expert

Proposition d'arborescence pour un projet datamart + BI en monorepo :

/Datamart/        scripts SQL numérotés (010_Core, 020_..)
/Reports/         projets PBIP (SemanticModel + Report)
/Tools/           scripts PowerShell, outils internes
/Docs/            documentation Markdown
/Releases/        (éventuellement) instantanés figés, un dossier par version
/.gitattributes   /.gitignore   /.tfignore (si TFVC)
/CHANGELOG.md     suivi métier versionné
  • Un README par dossier structurant (rôle, contenu, conventions) ; un README qui contredit le code est un défaut au même titre qu'un test rouge.
  • Changelog : séparer le journal de travail quotidien (local, non archivé) du suivi métier par version (archivé).
  • Pas de journal de corrections dans le code : l'historique de la GDS suffit ; l'en-tête porte la version et les métadonnées.

Contribution de l'IA#

🤖 IA

Usages pertinents pour la GDS des données.

Cas d'usage Gain Risque Maturité Prérequis Garde-fous
Expliquer le diff d'une procédure SQL ou d'une mesure DAX 4/5 3/5 4/5 Diff isolé Rejouer sur données, vérifier les cas limites (NULL, doublons)
Générer le script de migration idempotent à partir d'un diff de schéma 4/5 4/5 3/5 Schéma de départ et cible Tester sur copie, relire tout DROP/ALTER ; l'IA ne voit pas les données
Rédiger/commenter des messages de commit et notes de version 4/5 2/5 4/5 Commits atomiques Relecture, pas de secrets dans le prompt
Résoudre un conflit TMDL/JSON 3/5 4/5 3/5 Les deux versions et le modèle Ouvrir dans Desktop, valider les relations ; ne pas supprimer/recréer une mesure
Écrire un contrôle (BOM, encodage, lineageTag dupliqués, isKey en double) 5/5 2/5 4/5 Règles explicites Tester sur cas positifs et négatifs
Documenter un modèle (dictionnaire de mesures) 4/5 3/5 4/5 TMDL en entrée Valider le sens métier avec les experts
Revue de code SQL (anti-patterns, performances) 3/5 3/5 3/5 Normes d'équipe Faux positifs ; plan d'exécution réel indispensable
Dépannage de pipeline de déploiement 3/5 3/5 3/5 Logs expurgés Ne pas coller de secrets

Exemples de prompts :

Voici deux versions d'une table TMDL (avant/après). Liste les changements
fonctionnels (mesures ajoutées, expressions DAX modifiées, relations changées)
et signale tout risque de rupture pour des rapports liés par lineageTag.
N'invente rien : cite la ligne concernée.
Écris un script T-SQL idempotent qui ajoute la colonne [CLI_SEGMENT] nvarchar(20)
NULL à [dm].[DIM_CLIENT] si elle n'existe pas, sans toucher aux données.
Ajoute un test de vérification final qui lève une erreur si la colonne manque.

Limites à garder en tête : l'IA n'exécute pas vos migrations ni ne connaît vos données ; elle « corrige » volontiers un accent ou une indentation qu'il fallait préserver ; elle peut proposer de supprimer et recréer un objet dont l'identité compte (mesure, colonne liée). La responsabilité de la mise en production reste humaine. Voir IA et outils et la synthèse transverse.

Pièges récapitulatifs#

🔴 Niveau expert

Piège Symptôme Remède
Commit d'un .pbix Dépôt gonfle, aucun diff PBIP, ou LFS
Encodage non contrôlé Accents corrompus à l'installation BOM, hook, test avec libellé témoin
Normalisation de fins de ligne tardive Diff de tout .gitattributes dès le début
Mesure supprimée puis recréée Rapports clients cassés Modifier en place
Deux colonnes clé dans une table de modèle Projet non ouvrable Contrôle automatique (une seule isKey)
Script non idempotent Échec au 2ᵉ rejeu Gardes IF EXISTS, test de rejeu
DROP non gardé dans un kit Perte de paramétrage client Revue systématique des DROP
Secret dans un TMDL ou un .ps1 Fuite Coffre, scan, rotation
Branches parallèles modifiant la même table Migrations conflictuelles Coordination, ordre, tests de rejeu
Kit non reproductible « Ça marchait sur ma machine » Générer depuis tag, dans un pipeline

Voir aussi#

✻ Rédigé par Claude Sonnet 5.5