Analyse d'impact des modifications apportées au schéma de la base de données

Analyse d'impact des modifications apportées au schéma de la base de données

Renommer une colonne prend trente secondes. Le script de migration s'exécute en une minute. Le déploiement en préproduction se déroule sans erreur. Le déploiement en production se déroule également sans erreur. Trois heures plus tard, une alerte de surveillance se déclenche : un service Java renvoie des réponses malformées, un traitement par lots COBOL s'interrompt avec une erreur SQL et le chargement des enregistrements dans un pipeline de reporting en aval est interrompu. La colonne a été renommée. Personne n'a informé les applications.

Il ne s'agit pas d'une hypothèse. Les systèmes d'information modernes sont constitués de bases de données entourées d'une grande variété d'applications logicielles qui dépendent de ces bases. Dans les environnements d'intégration d'applications d'entreprise, les bases de données sont partagées par des applications développées par différentes parties indépendantes, et les développeurs de ces applications n'ont souvent que peu ou pas de contrôle sur l'évolution du schéma de la base de données. Les bases de données et les applications logicielles peuvent ne pas toujours être synchronisées, et cette incohérence entraîne des pertes de données, des pannes de programmes et une baisse des performances. La solution ne réside pas dans un processus de déploiement plus lent, mais dans une analyse d'impact complète avant l'exécution du script de migration.

Connaître toutes les dépendances avant toute modification de schéma

SMART TS XL Il cartographie chaque application, pipeline et dépendance interlangage avant l'exécution de votre script de migration.

EN SAVOIR PLUS…

Tous les changements de schéma ne sont pas égaux.

La première étape de toute analyse d'impact de schéma consiste à classifier la modification proposée. Une modification ajoutant une colonne optionnelle à une table est fondamentalement différente d'une modification renommant une colonne existante, même si les deux utilisent la même syntaxe ALTER TABLE. L'une est rétrocompatible ; l'autre est incompatible avec tous les systèmes utilisant le nom de colonne d'origine.

Les modifications incompatibles entraînent des défaillances chez les consommateurs existants sans aucune intervention de leur part. Elles nécessitent un déploiement coordonné : chaque composant dépendant doit être mis à jour avant ou simultanément à la modification du schéma, ou bien le consommateur doit être mis à jour en premier et déployé derrière une couche de compatibilité jusqu'à ce que le schéma soit mis à jour.

Les modifications non destructives sont rétrocompatibles. Les consommateurs existants continuent de fonctionner sans changement. Les nouveaux consommateurs peuvent tirer parti du nouvel élément de schéma à leur propre rythme.

La classification détermine le périmètre de l'analyse, la coordination du déploiement requise et la complexité du retour en arrière :

Changer le typeAbandonnerCible d'impact primaireNiveau de risque
Ajouter une colonne pouvant être nulleNonNouveau code uniquementLow
Ajouter une colonne NOT NULL sans valeur par défautOuiToutes les instructions INSERTCritical
Renommer la colonneOuiChaque instruction SELECT, INSERT, UPDATE y faisant référenceCritical
Déposer la colonneOuiChaque référence n'importe oùCritical
Élargir le type de données (INT à BIGINT)PartielApplications qui vérifient la longueur ou le type des champsMoyenne
Type de données étroit (VARCHAR 500 à 100)OuiApplications stockant des valeurs plus longtemps que la nouvelle limiteHaute
Ajouter un indexNonPerformances uniquement, les requêtes restent validesLow
Indice de chutePartielPerformances des requêtes ; exactitude inchangéeMoyenne
Renommer la tableOuiChaque référence n'importe oùCritical
Ajouter une contrainte de clé étrangèrePartielLes données existantes doivent satisfaire à la contrainteMoyen-élevé
Remplacez nullable par NOT NULLOuiApplications insérant des valeurs NULL dans cette colonneHaute
Modifier la signature de la procédure stockéeOuiTous les appelants de la procédureCritical
Procédure de suppression stockéeOuiTous les appelants de la procédureCritical
Renommer la vueOuiTous les consommateurs de la vueCritical
Modifier la définition de la vuePartielConsommateurs des colonnes concernéesMoyen-élevé

Règle de déploiement : Toute modification critique nécessite un inventaire complet des dépendances avant son déploiement. Toute modification à haut risque requiert un déploiement progressif avec validation à chaque étape. Toute modification à risque moyen requiert au minimum une analyse des cibles d’impact principales. Les modifications à faible risque peuvent être déployées avec des tests standard, mais doivent néanmoins être consignées.

Les quatre couches de dépendance : là où l’impact du schéma se manifeste

L'erreur la plus grave dans l'analyse d'impact des modifications de schéma est de la considérer comme un problème uniquement lié à la base de données. L'impact d'un renommage de colonne s'étend bien au-delà de la base de données elle-même, à travers quatre niveaux de dépendance distincts, chacun nécessitant des techniques d'analyse différentes pour être identifié.

Couche 1 : Dépendances internes à la base de données

La couche la plus visible. Au sein même de la base de données, une modification du schéma peut affecter :

Les vues qui effectuent une sélection sur la table modifiée renverront une erreur ou des résultats incorrects après le renommage, selon que la vue est matérialisée ou non.

Procédures stockées et fonctions qui font référence à la colonne dans leurs instructions SELECT, INSERT, UPDATE ou DELETE.

Déclencheurs qui s'activent lors d'une insertion ou d'une mise à jour dans la table modifiée et qui font référence à des noms de colonnes spécifiques dans leur logique.

Vérifiez les contraintes et les colonnes calculées qui font référence à la colonne par son nom.

Relations de clés étrangères qu'une suppression de colonne invaliderait.

Ces dépendances sont interrogeables directement depuis le catalogue de la base de données. SQL Server fournit sys.sql_dependencies et sys.dm_sql_referenced_entitiesPostgreSQL fournit pg_dependOracle fournit ALL_DEPENDENCIESLes requêtes ci-dessous énumèrent les dépendances internes à la base de données pour une table et une colonne spécifiques :

sql

-- SQL Server: all objects referencing a specific column
SELECT
    OBJECT_NAME(d.object_id)     AS dependent_object,
    o.type_desc                  AS object_type,
    OBJECT_NAME(d.referenced_major_id) AS referenced_table,
    COL_NAME(d.referenced_major_id,
             d.referenced_minor_id)   AS referenced_column
FROM sys.sql_dependencies d
JOIN sys.objects o ON o.object_id = d.object_id
WHERE d.referenced_major_id   = OBJECT_ID('dbo.Customers')
  AND d.referenced_minor_id   = COLUMNPROPERTY(
        OBJECT_ID('dbo.Customers'), 'CustomerName', 'ColumnId')
ORDER BY o.type_desc, dependent_object;

sql

-- PostgreSQL: views and functions depending on a specific column
SELECT
    dep.classid::regclass        AS dependency_type,
    dependent.relname            AS dependent_object,
    a.attname                    AS referenced_column,
    source.relname               AS source_table
FROM pg_depend dep
JOIN pg_class source    ON source.oid    = dep.refobjid
JOIN pg_class dependent ON dependent.oid = dep.objid
JOIN pg_attribute a     ON a.attrelid    = dep.refobjid
                       AND a.attnum      = dep.refobjsubid
WHERE source.relname = 'customers'
  AND a.attname      = 'customer_name';

sql

-- Oracle: full dependency chain for objects referencing a table
SELECT
    name          AS dependent_object,
    type          AS object_type,
    referenced_name,
    referenced_type
FROM user_dependencies
WHERE referenced_name = 'CUSTOMERS'
ORDER BY type, name;

Ces requêtes couvrent intégralement la couche 1. Elles ne concernent pas les couches 2 à 4.

Couche 2 : Dépendances du code applicatif

C’est au niveau de la deuxième couche que la plupart des incidents de production prennent naissance, et c’est là que les requêtes du catalogue de la base de données ne fournissent aucune visibilité. Le code applicatif qui interagit avec la base de données le fait par le biais de :

Requêtes JDBC et ODBC dans les applications Java et .NET, où les noms de colonnes apparaissent sous forme de chaînes littérales dans les requêtes SQL intégrées au code source.

Dans Hibernate, Entity Framework, SQLAlchemy et ActiveRecord, les noms de tables et de colonnes sont associés à des champs d'objets via l'ORM . Renommer une colonne nécessite une modification du schéma et de la configuration de l'ORM. Si cette dernière modification est omise, l'ORM associe silencieusement le nouveau nom de colonne à l'ancien champ, ce qui peut entraîner des valeurs nulles ou des erreurs de mappage.

SQL intégré dans les programmes COBOL , où SQL apparaît au sein des blocs EXEC SQL / END-EXEC dans le code COBOL PROCEDURE DIVISION. Il s'agit du type de dépendance le plus critique et le plus souvent négligé dans les environnements d'entreprise. L'instruction :

Cobol

       EXEC SQL
           SELECT CUST-NAME, CUST-ADDR, CUST-PHONE
           INTO :WS-CUST-NAME, :WS-CUST-ADDR, :WS-CUST-PHONE
           FROM CUSTOMERS
           WHERE CUST-ID = :WS-CUST-ID
       END-EXEC

Il ne s'agit pas de SQL, mais de code source COBOL contenant une instruction SQL intégrée. Un outil standard de gestion des dépendances SQL ou une requête de catalogue de base de données ne trouvera pas cette référence, car elle se trouve dans un fichier source COBOL et non dans la définition d'un objet SQL. Sa recherche nécessite l'analyse du code source COBOL.

Le SQL dynamique est construit à partir de modèles de chaînes de caractères où les noms de colonnes sont assemblés à l'exécution. Ces modèles ne peuvent être détectés par une analyse statique des littéraux SQL ; leur détection nécessite soit une analyse dynamique (exécution de l'application dans des conditions de test), soit un examen manuel approfondi des modèles de construction des chaînes.

Résolveurs GraphQL et sérialiseurs d'API qui associent les noms des colonnes de la base de données aux noms des champs de réponse. Une API qui expose customerName d'une colonne nommée customer_name Un mappage direct de colonne ne fonctionnera plus lorsque la colonne sera renommée, même si la requête SQL de l'application est mise à jour, car le mappage du sérialiseur fait également référence au nom d'origine.

Couche 3 : Dépendances ETL, pipeline et plateforme de données

La troisième couche englobe tous les processus de déplacement de données qui affectent la table ou la colonne modifiée :

Les tâches ETL (qu'elles soient écrites en code personnalisé, gérées par Informatica, Talend ou SSIS, ou exprimées sous forme de DAG Airflow) qui sélectionnent des données dans la table modifiée pour transformation et chargement dans les systèmes en aval.

Les configurations de capture des données modifiées (CDC) (Debezium, Oracle GoldenGate, SQL Server CDC) diffusent les modifications au niveau des lignes depuis la base de données source. Ces configurations font référence à des noms de tables et de colonnes spécifiques ; par exemple, le renommage d'une colonne génère un événement de modification avec le nouveau nom, que les processus CDC en aval peuvent ne pas reconnaître.

Les processus de chargement des entrepôts de données et des lacs de données aplatissent les structures relationnelles en formats colonnaires. Tout renommage de colonne à la source nécessite un renommage correspondant dans le schéma de l'entrepôt, le script de chargement et chaque requête analytique ou tableau de bord faisant référence à cette colonne.

Les requêtes de reporting intégrées aux outils de BI (classeurs Tableau, jeux de données Power BI, définitions LookML de Looker) référencent directement les noms de colonnes. Souvent non documentées, elles ne sont découvertes que lorsqu'un rapport cesse de fonctionner après une modification de schéma.

Couche 4 : Dépendances en aval et avec les partenaires

La couche la plus externe : les systèmes situés hors du contrôle direct de l’organisation qui consomment des données issues de la base de données modifiée.

Consommateurs d'API externes qui reçoivent des réponses contenant des noms de champs mappés à partir de noms de colonnes. Si une API publique inclut customer_name Dans sa réponse, et ce champ étant généré par un mappage direct des colonnes, un renommage rompt le contrat de l'API pour chaque consommateur externe.

Flux de données partenaires qui reçoivent des extraits de la table modifiée au format fichier plat, CSV ou XML, où les positions ou les noms des champs sont définis par le schéma d'extraction.

Systèmes de conformité et de rapports réglementaires où des définitions de colonnes spécifiques sont référencées dans les spécifications des rapports réglementaires qui peuvent avoir été convenues avec une autorité externe.

Détection des dépendances du code applicatif : les techniques d’analyse

La couche 1 est en libre-service via des requêtes de catalogue. Les couches 2 à 4 nécessitent des techniques différentes selon le langage et l'architecture :

Recherche de chaînes de caractères (rapide, incomplète) : Utilise grep ou ripgrep dans le code source pour rechercher le nom de la table, le nom de la colonne ou les deux. Rapide et facile à automatiser. Ne détecte pas les requêtes SQL dynamiques et génère de faux positifs dans les commentaires et la documentation.

bash

# Find all files referencing a specific column
rg "customer_name|CUST-NAME|customerName" \
  --type java --type py --type cs --type cbl \
  --glob "!**/test/**" \
  -l  # list files only, for scope assessment

# More precise: find SQL contexts specifically
rg "(?i)(SELECT|INSERT|UPDATE|WHERE).*customer_name" \
  --type java --type py

Analyse basée sur l'AST (plus précise, spécifique au langage) : analyse du code source en un arbre de syntaxe abstraite et parcours de celui-ci pour trouver les chaînes de caractères SQL, les annotations ORM et les configurations de mappage. Plus précise que la recherche de chaînes, mais nécessite un analyseur distinct par langage.

Analyse sémantique des flux de données (la plus précise, la plus coûteuse) : analyse statique de programme utilisant l’analyse des flux de données pour extraire toutes les interactions possibles d’une application avec la base de données. Cette technique, formalisée dans le cadre d’une recherche IEEE sur l’analyse d’impact des modifications de schéma, suit les données depuis la construction de la requête de base de données jusqu’à l’exécution, en passant par l’affectation des variables. Elle identifie les références aux colonnes SQL, même lorsqu’elles sont assemblées par fragments plutôt qu’écrites sous forme de chaînes complètes. La recherche démontre que cette analyse doit être sensible au contexte pour atteindre une précision élevée et que le découpage du programme réduit considérablement le temps d’analyse tout en préservant son exhaustivité.

Recommandation pratique : utilisez la recherche de chaînes de caractères pour une évaluation rapide du périmètre. Utilisez l’AST ou l’analyse sémantique pour une énumération exhaustive avant toute modification critique. Ne renommez ni ne supprimez jamais une colonne en vous basant uniquement sur une recherche de chaînes de caractères ; le risque de faux négatifs est trop élevé.

Impact des schémas dans les environnements d'entreprise multilingues

Dans une application web moderne standard (backend Java, frontend React, base de données PostgreSQL), la portée des dépendances d'une modification de schéma est limitée au code source de l'application. Un renommage de colonne affecte les chaînes SQL dans la couche Java et le mappage des champs API dans le sérialiseur. Ces deux éléments sont identifiables en effectuant une recherche dans le même code source.

Les environnements d'entreprise dotés de systèmes mainframe hérités diffèrent à tous égards. Une colonne DB2 du système bancaire central d'un établissement financier peut être référencée par :

  • Programmes COBOL avec SQL intégré qui traitent les transactions quotidiennes des comptes
  • Étapes de travail JCL qui génèrent des fichiers d'extraction dont la mise en page correspond à la colonne
  • Microservices Java qui appellent des procédures stockées faisant référence à la colonne
  • Pipelines de données Python interrogeant directement DB2 via JDBC pour la génération de rapports
  • Vues SQL utilisées par les outils de BI pour les tableaux de bord de direction
  • Programmes de transaction CICS qui affichent la valeur de la colonne sur les écrans du terminal

Ces références existent dans cinq langages différents, dans trois environnements d'exécution distincts (mainframe, cloud, plateforme BI), et sont gérées par des équipes qui ne communiquent pas nécessairement directement. Un changement de nom de colonne, pourtant convenu entre l'équipe de la base de données et l'équipe du service Java, peut rester inconnu des équipes COBOL, de reporting et de BI jusqu'à la défaillance de leurs systèmes.

Les techniques d'analyse statique de programmes permettent d'identifier l'impact des modifications de schéma de base de données relationnelle sur les applications orientées objet. Pour ce faire, elles utilisent l'analyse de flux de données afin d'extraire toutes les interactions possibles avec la base de données. Ce même principe, appliqué simultanément à COBOL, JCL, Python et SQL, consiste à analyser le code SQL intégré dans le code source COBOL, les blocs EXEC SQL dans les programmes JCL, les requêtes paramétrées dans les scripts Python et les objets SQL dans la base de données. Cette analyse produit une cartographie complète des dépendances entre les langages, rendant ainsi possible l'analyse d'impact des modifications de schéma multilingues.

Intégration CI/CD : automatiser l’analyse d’impact

Une analyse d'impact manuelle avant chaque modification de schéma est préférable à l'absence d'analyse. L'analyse d'impact automatisée, intégrée à un processus CI/CD, est préférable à l'analyse manuelle : elle s'exécute systématiquement, sans dépendre de la rigueur des développeurs, et bloque le déploiement en cas d'analyse incomplète.

yaml

# GitHub Actions: schema impact gate
name: Schema Change Impact Analysis

on:
  pull_request:
    paths:
      - 'migrations/**'
      - 'schema/**'
      - '**/*.sql'

jobs:
  schema-impact:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Detect schema changes
        id: detect
        run: |
          git diff origin/main...HEAD -- migrations/ schema/ \
            > schema_changes.diff

          # Classify: any breaking changes?
          if grep -qiE \
            "DROP COLUMN|RENAME|ALTER.*NOT NULL|DROP TABLE|DROP PROCEDURE" \
            schema_changes.diff; then
            echo "breaking=true" >> $GITHUB_OUTPUT
            echo "Breaking schema changes detected"
          else
            echo "breaking=false" >> $GITHUB_OUTPUT
          fi

      - name: Block on breaking change without impact sign-off
        if: steps.detect.outputs.breaking == 'true'
        run: |
          # Check for required impact analysis label on PR
          if ! gh pr view ${{ github.event.pull_request.number }} \
            --json labels --jq '.labels[].name' \
            | grep -q "impact-analysis-complete"; then
            echo "ERROR: Breaking schema change requires impact-analysis-complete label"
            echo "Complete the impact analysis checklist before merging"
            exit 1
          fi
        env:
          GH_TOKEN: ${{ github.token }}

      - name: Run catalog dependency check
        run: |
          psql ${{ secrets.DB_URL }} -f scripts/check_dependencies.sql \
            | tee dependency_report.txt

          if grep -q "DEPENDENT_COUNT > 0" dependency_report.txt; then
            echo "Dependents found -- review dependency_report.txt"
          fi

Le contrôle décrit ci-dessus remplit trois fonctions : il détecte la présence de modifications incompatibles, exige qu’un relecteur ait réalisé et validé l’analyse d’impact avant d’autoriser la fusion, et exécute la requête de dépendance du catalogue pour recenser les dépendances internes à la base de données. L’étiquetage constitue le principal point de contrôle humain ; le pipeline ne peut pas le contourner, ce qui signifie que l’analyse d’impact doit être effectuée et documentée avant toute fusion de code.

Que contient un rapport d'impact complet sur un schéma ?

L'analyse d'impact d'un schéma aboutit à un rapport structuré que les comités consultatifs sur les changements, les architectes et les administrateurs de bases de données peuvent utiliser pour autoriser le déploiement. Un rapport complet contient :

1. Définition de la modification proposée , l'instruction DDL exacte déployée, la table et la colonne affectées, et la raison de la modification.

2. Modifier la classification , à partir de la taxonomie des risques : rupture ou non-rupture, niveau de risque et catégorie d'impact spécifique (risque de perte de données, risque d'échec de requête, risque de performance).

3. Dépendances internes à la base de données , le résultat de la requête de catalogue : chaque vue, procédure stockée, fonction et déclencheur qui référence l’objet modifié, avec sa définition actuelle et la modification requise.

4. Dépendances du code applicatif , par langage, avec le chemin d'accès au fichier, le numéro de ligne si possible et la référence SQL spécifique. Classées par équipe ou service si plusieurs équipes gèrent le code.

5. Dépendances ETL et pipeline , par nom de pipeline, tâche et référence spécifique à la colonne ou à la table modifiée.

6. Dépendants en aval et partenaires , par nom de système, flux de données ou contrat API, avec le nom du champ tel qu'il apparaît dans l'interface en aval.

7. Modifications requises par dépendance : pour chaque dépendance trouvée, la modification spécifique requise pour maintenir l’exactitude après le déploiement de la modification du schéma.

8. Séquence de déploiement : ordre dans lequel les dépendances doivent être mises à jour et la modification de schéma déployée pour garantir la cohérence. Les modifications incompatibles nécessitent généralement : (1) le déploiement d’une couche de compatibilité ou d’une valeur par défaut, (2) la mise à jour de tout le code de l’application pour référencer le nouveau nom de colonne, (3) le déploiement du code de l’application, (4) la validation, (5) le déploiement de la modification de schéma, (6) la validation, (7) la suppression de la couche de compatibilité.

9. Cas de test requis : un test de validation par type dépendant, plus des tests de régression pour toutes les procédures stockées modifiées.

10. Plan de restauration , le DDL inverse et toute migration de données nécessaire pour restaurer l'état du schéma précédent si le déploiement doit être annulé.

L'importance des rapports : Un rapport d'impact existant mais non exploité est pire que l'absence de rapport ; il donne l'illusion d'une diligence raisonnable alors que le risque réel demeure. Chaque élément de la liste des dépendances doit être mis à jour avant le déploiement ou explicitement reconnu comme un risque connu assorti d'un plan de contingence.

Comment SMART TS XL Fournit une analyse d'impact des schémas multilingues

Les requêtes standard de catalogue de bases de données recensent les dépendances de la couche 1 (vues, procédures stockées et déclencheurs). Les outils de recherche de code applicatif recensent certaines dépendances de la couche 2 au sein d'un même langage. Aucun outil ne couvre l'ensemble des quatre couches et de tous les langages.

SMART TS XL's analyse de code statique Il analyse simultanément le SQL intégré dans les fichiers sources COBOL, les chaînes de requêtes JDBC dans les services Java, les modèles SQLAlchemy dans les pipelines Python et les définitions d'objets SQL. Lorsqu'une colonne DB2 est proposée pour être renommée, SMART TS XL identifie en une seule passe d'analyse, sur l'ensemble du portefeuille multilingue, chaque bloc SQL COBOL EXEC faisant référence à cette colonne, chaque chaîne de requête Java JDBC contenant le nom de la colonne, chaque requête Python utilisant la colonne et chaque vue SQL ou procédure stockée y faisant référence.

La cartographie des dépendances de l'application étend l'analyse au-delà des références directes aux colonnes pour inclure la chaîne de dépendances structurelles : si un service Java appelle une procédure stockée qui référence la colonne modifiée, la cartographie des dépendances représente à la fois la dépendance Java-procédure et la dépendance procédure-colonne, rendant ainsi le service Java visible dans le périmètre d'impact même si son code ne contient aucune référence directe à la colonne.

La fonctionnalité d'analyse d'impact utilise ce graphe de dépendances interlangages pour répondre à la question fondamentale qui précède chaque modification de schéma : étant donné la modification proposée, énumérer tous les composants qui seront affectés, dans tous les langages et à tous les niveaux. La réponse est une liste structurée et numérotée qui correspond directement au modèle de rapport d'impact ci-dessus ; il ne s'agit pas d'une estimation, ni de la meilleure mémoire d'un développeur quant aux éléments potentiellement affectés, mais d'une déduction structurelle à partir du code source.

La fonctionnalité de recherche d'entreprise permet d'interroger l'inventaire des dépendances tout au long du cycle de vie de la gestion des changements : trouvez simultanément, en quelques secondes, tous les programmes qui référencent une colonne spécifique dans COBOL, Java, Python et SQL, sur des millions de lignes de code.

Pour les équipes gérant les modifications de schéma dans des environnements qui s'étendent modernisation de l'héritage Dans les programmes où la base de données est susceptible d'être partagée entre une application mainframe COBOL en cours de modernisation et les services Java modernes qui la remplacent, l'analyse d'impact interlangage est indispensable. Lors d'une transition de modernisation, les couches existantes et modernes sont exécutées simultanément en production. Une modification de schéma sans risque pour le service Java peut être inconnue des programmes COBOL qui continuent de s'exécuter en parallèle. SMART TS XL voit les deux côtés de cette frontière simultanément.

Les modifications de schéma ne provoquent pas de dysfonctionnement des applications. Ce sont les modifications de schéma non analysées qui en sont responsables.

L'échec de déploiement mentionné au début de ce guide, à savoir le renommage d'une colonne ayant entraîné la défaillance d'un service Java, d'un traitement par lots COBOL et d'un pipeline de reporting trois heures après sa mise en production, n'était pas dû à un problème au niveau du script de migration. Ce dernier s'est exécuté correctement et la colonne a été renommée comme prévu. L'erreur résidait dans l'analyse préalable qui aurait dû être effectuée : l'énumération de toutes les applications référençant le nom de colonne d'origine, la vérification de leur mise à jour et la validation de la cohérence entre la base de données et chaque application lors du déploiement.

L'analyse d'impact du schéma n'est pas une simple formalité administrative. C'est le travail qui transforme un déploiement risqué en un déploiement sûr, en convertissant l'étendue inconnue d'une modification en une liste exhaustive et vérifiable de tous les éléments affectés. Le script de migration prend une minute. L'analyse d'impact prend le temps nécessaire. L'incident de production qu'elle permet d'éviter se produit en plusieurs jours.