{"id":40342,"date":"2025-09-25T11:54:29","date_gmt":"2025-09-25T09:54:29","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=40342"},"modified":"2025-09-25T11:59:17","modified_gmt":"2025-09-25T09:59:17","slug":"metadata-driven-pipelines-la-continuite-du-master-package-ssis","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/","title":{"rendered":"Metadata-driven pipelines : la continuit\u00e9 du Master Package SSIS"},"content":{"rendered":"\n<p><strong>Organiser des flux<\/strong>, c\u2019est une question qui m\u2019a accompagn\u00e9 tout au long de ma carri\u00e8re.<\/p>\n\n\n\n<p>Quand j\u2019ai commenc\u00e9 avec les ETL, j\u2019ai appris \u201c\u00e0 l\u2019ancienne\u201d : toutes les r\u00e8gles de gestion cod\u00e9es directement dans les packages. Une approche rigide, lourde \u00e0 maintenir, et qui surtout cr\u00e9ait une d\u00e9pendance forte de mes clients envers moi.<\/p>\n\n\n\n<p>Assez vite, j\u2019ai d\u00e9velopp\u00e9 une autre m\u00e9thode, que j\u2019ai fini par appliquer d\u00e8s que je le pouvais :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>utiliser l\u2019<strong>ETL<\/strong> comme orchestrateur,<\/li>\n\n\n\n<li>confier le c\u0153ur du traitement au SQL,<\/li>\n\n\n\n<li>et donner \u00e0 mes clients plus d\u2019autonomie, tout en simplifiant la maintenance.<\/li>\n<\/ul>\n\n\n\n<p>Dans ce blog, je vais partager cette approche et comparer deux contextes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La structure de base que j&#8217;utilise pour <strong>SSIS <\/strong>depuis de longues ann\u00e9es<\/li>\n\n\n\n<li>Ce m\u00eame mod\u00e8le r\u00e9-adapt\u00e9 \u00e0 <strong>MS Fabric<\/strong> et aux nouvelles options que <strong>Pipeline<\/strong> offre<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-le-master-package-ssis-ma-premiere-brique-de-factorisation\">Le Master Package SSIS : ma premi\u00e8re brique de factorisation<\/h3>\n\n\n\n<p>Quand j\u2019ai commenc\u00e9 \u00e0 travaill\u00e9 avec SSIS, j\u2019ai vite cherch\u00e9 \u00e0 \u00e9viter de r\u00e9p\u00e9ter les m\u00eames flux. Dupliquer dix fois un package juste parce qu\u2019on change le nom d\u2019une table, pour moi, \u00e7a n\u2019a jamais eu de sens.<\/p>\n\n\n\n<p>La solution que j\u2019ai mise en place, c\u2019\u00e9tait le <strong>Master Package<\/strong>, ce n&#8217;est pas une id\u00e9e nouvelle, mais je l&#8217;ai adapt\u00e9 \u00e0 ma fa\u00e7on de travailler. L\u2019id\u00e9e \u00e9tait simple :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>construire des packages enfants tr\u00e8s unitaires (un fichier, une table, une logique claire),<\/li>\n\n\n\n<li>centraliser l\u2019ex\u00e9cution dans un Master qui lit une table de pilotage,<\/li>\n\n\n\n<li>et ex\u00e9cuter les sous-packages selon un sc\u00e9nario d\u00e9fini en base.<\/li>\n<\/ul>\n\n\n\n<p><strong>Avantages obtenus :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>factorisation maximale,<\/li>\n\n\n\n<li>possibilit\u00e9 pour mes clients d\u2019activer\/d\u00e9sactiver un flux par simple mise \u00e0 jour en table,<\/li>\n\n\n\n<li>orchestration g\u00e9r\u00e9e sans red\u00e9ploiement du projet,<\/li>\n\n\n\n<li>centralisation des logs de process en un seul point.<\/li>\n<\/ul>\n\n\n\n<p>Un m\u00e9canisme de logging centralis\u00e9 dans le Master Package me permettait de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>tracer l\u2019ex\u00e9cution de chaque sous-package,<\/li>\n\n\n\n<li>uniformiser les retours d\u2019erreurs,<\/li>\n\n\n\n<li>simplifier la maintenance.<\/li>\n<\/ul>\n\n\n\n<p>Plus besoin d\u2019ouvrir 15 packages pour comprendre o\u00f9 \u00e7a avait cass\u00e9 : tout remontait dans la m\u00eame table de suivi.<\/p>\n\n\n\n<p><strong>Exemple de mod\u00e8le utilis\u00e9 :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE dbo.Packages\n(\n    PackageID    INT            IDENTITY(1,1) PRIMARY KEY,\n    PackageName  VARCHAR( 100 ) NOT NULL, -- Nom du .dtsx\n    Description  VARCHAR( 400 ) NULL,\n    IsEnabled    BIT            NOT NULL DEFAULT (1),\n    CreatedAt    DATETIME2(0)   NOT NULL DEFAULT (SYSUTCDATETIME()),\n    CONSTRAINT UQ_Packages__PackageName UNIQUE (PackageName)\n);\nGO\n\n\/* Param\u00e8tres par d\u00e9faut au niveau du package (surcharg\u00e9s par sc\u00e9nario si besoin) *\/\nCREATE TABLE dbo.PackageParameters\n(\n    PackageID    INT           NOT NULL FOREIGN KEY REFERENCES dbo.Packages(PackageID),\n    ParamName    VARCHAR(128)  NOT NULL,\n    DefaultValue VARCHAR(4000) NOT NULL,\n    CONSTRAINT PK_PackageParameters PRIMARY KEY (PackageID, ParamName)\n);\nGO\n\n\n\/* =========================================================================\n   SC\u00c9NARIOS (contextes d\u2019ex\u00e9cution) &amp; ORCHESTRATION\n   ========================================================================= *\/\nCREATE TABLE dbo.Scenarios\n(\n    ScenarioID   INT          IDENTITY(1,1) PRIMARY KEY,\n    ScenarioName VARCHAR(100) NOT NULL, -- DAILY \/ BACKFILL \/ CLIENT_X ...\n    Description  VARCHAR(400) NULL,\n    IsActive     BIT          NOT NULL DEFAULT (1),\n    CreatedAt    DATETIME2(0) NOT NULL DEFAULT (SYSUTCDATETIME()),\n    CONSTRAINT UQ_Scenarios__ScenarioName UNIQUE (ScenarioName)\n);\nGO\n\nCREATE TABLE dbo.ScenarioSteps\n(\n    ScenarioStepID  INT IDENTITY(1,1) PRIMARY KEY,\n    ScenarioID      INT NOT NULL FOREIGN KEY REFERENCES dbo.Scenarios(ScenarioID),\n    PackageID       INT NOT NULL FOREIGN KEY REFERENCES dbo.Packages(PackageID),\n    ExecutionOrder  INT NOT NULL,\n    IsActive        BIT NOT NULL DEFAULT (1),\n    RetryCount      INT NOT NULL DEFAULT (0),\n    ContinueOnError BIT NOT NULL DEFAULT (0),\n    TimeoutSec      INT NULL,                -- optionnel : timeouts par step\n    CONSTRAINT UQ_Steps__Scenario_Order UNIQUE (ScenarioID, ExecutionOrder)\n);\nGO\n\n\/* Surcharges de param\u00e8tres au niveau sc\u00e9nario\u2192package *\/\nCREATE TABLE dbo.ScenarioParameters\n(\n    ScenarioID INT            NOT NULL FOREIGN KEY REFERENCES dbo.Scenarios(ScenarioID),\n    PackageID  INT            NOT NULL FOREIGN KEY REFERENCES dbo.Packages(PackageID),\n    ParamName  VARCHAR(128)   NOT NULL,\n    ParamValue VARCHAR(4000)  NOT NULL,\n    CONSTRAINT PK_ScenarioParameters PRIMARY KEY (ScenarioID, PackageID, ParamName)\n);\nGO\n\n\/* Vue des param\u00e8tres \u201ceffectifs\u201d (Scenario override &gt; d\u00e9faut package) *\/\nCREATE VIEW dbo.vw_EffectiveParameters\nAS\nSELECT s.ScenarioID,\n       p.PackageID,\n       pp.ParamName,\n       COALESCE(sp.ParamValue, pp.DefaultValue) AS EffectiveValue\n  FROM dbo.Scenarios          AS s\n       INNER JOIN dbo.ScenarioSteps      AS ss ON ss.ScenarioID = s.ScenarioID AND ss.IsActive = 1\n       INNER JOIN dbo.Packages           AS p  ON p.PackageID   = ss.PackageID AND p.IsEnabled = 1\n        LEFT JOIN dbo.PackageParameters  AS pp ON pp.PackageID  = p.PackageID\n        LEFT JOIN dbo.ScenarioParameters AS sp ON sp.ScenarioID = s.ScenarioID\n                                              AND sp.PackageID  = p.PackageID\n                                              AND sp.ParamName  = pp.ParamName;\nGO\n\n\n\/* =========================================================================\n   LOGS CENTRALIS\u00c9S (header run + d\u00e9tails par step)\n   ========================================================================= *\/\nCREATE TABLE dbo.ProcessRun\n(\n    RunID         BIGINT       IDENTITY(1,1) PRIMARY KEY,\n    ScenarioName  VARCHAR(100) NOT NULL,\n    Status        VARCHAR(20)  NOT NULL, -- Started \/ Succeeded \/ Failed \/ PartiallyFailed\n    StartTime     DATETIME2(0) NOT NULL DEFAULT (SYSUTCDATETIME()),\n    EndTime       DATETIME2(0) NULL,\n    DurationSec   INT          NULL,\n    TriggeredBy   VARCHAR(128) NULL, -- Agent, utilisateur, API, etc.\n    CorrelationID UNIQUEIDENTIFIER NOT NULL DEFAULT (NEWID())\n);\nGO\n\nCREATE TABLE dbo.ProcessRunStep\n(\n    RunStepID      BIGINT        IDENTITY(1,1) PRIMARY KEY,\n    RunID          BIGINT        NOT NULL FOREIGN KEY REFERENCES dbo.ProcessRun(RunID),\n    ScenarioStepID INT           NULL,          -- facultatif : rattacher au mod\u00e8le\n    ScenarioName   VARCHAR(100)  NOT NULL,\n    PackageName    SYSNAME       NOT NULL,\n    Status         VARCHAR(20)   NOT NULL,      -- Started \/ Succeeded \/ Failed \/ Skipped \/ Retried\n    StartTime      DATETIME2(0)  NOT NULL DEFAULT (SYSUTCDATETIME()),\n    EndTime        DATETIME2(0)  NULL,\n    DurationSec    INT           NULL,\n    Retries        INT           NOT NULL DEFAULT (0),\n    ErrorMessage   VARCHAR(2000) NULL\n);\nGO\n\n\/* Index utiles *\/\nCREATE INDEX IX_ProcessRun__StartTime   ON dbo.ProcessRun     (StartTime DESC);\nCREATE INDEX IX_ProcessRunStep__RunID   ON dbo.ProcessRunStep (RunID);\nCREATE INDEX IX_Steps__Scenario_Order   ON dbo.ScenarioSteps  (ScenarioID, ExecutionOrder);\nGO<\/code><\/pre>\n\n\n\n<p><strong>Requ\u00eates \u201cma\u00eetre\u201d utilis\u00e9es par le Master Package<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/* 1) Plan d\u2019ex\u00e9cution pour un sc\u00e9nario donn\u00e9 *\/\nDECLARE @ScenarioName VARCHAR(100) = @ScenarioNameInput;\n\nSELECT s.ScenarioName,\n       p.PackageName,\n       ss.ExecutionOrder,\n       ss.RetryCount,\n       ss.ContinueOnError,\n       ss.TimeoutSec\n  FROM dbo.ScenarioSteps AS ss\n       INNER JOIN dbo.Scenarios AS s ON s.ScenarioID = ss.ScenarioID\n\t                                AND s.IsActive  = 1\n       INNER JOIN dbo.Packages  AS p ON p.PackageID = ss.PackageID\n\t                                AND p.IsEnabled = 1\n WHERE s.ScenarioName = @ScenarioName\n   AND ss.IsActive    = 1\n ORDER BY\n       ss.ExecutionOrder ASC;\n\n\/* 2) Param\u00e8tres effectifs pour (Sc\u00e9nario, Package) *\/\nDECLARE @ScenarioName VARCHAR(100) = @ScenarioNameInput;\nDECLARE @PackageName  SYSNAME       = @PackageNameInput;\n\nSELECT ep.ParamName,\n       ep.EffectiveValue\n  FROM dbo.vw_EffectiveParameters AS ep\n       INNER JOIN dbo.Scenarios AS s  ON s.ScenarioID = ep.ScenarioID\n       INNER JOIN dbo.Packages  AS p  ON p.PackageID  = ep.PackageID\n WHERE s.ScenarioName = @ScenarioName\n   AND p.PackageName  = @PackageName;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Explication du mod\u00e8le SSIS<\/h3>\n\n\n\n<p>Ce mod\u00e8le repose sur un principe simple : <strong>s\u00e9parer la logique technique de l\u2019orchestration.<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Packages<\/strong> : liste des packages disponibles (chargement d\u2019une table, traitement d\u2019un fichier\u2026).\n<ul class=\"wp-block-list\">\n<li>1 package = 1 traitement.<\/li>\n\n\n\n<li>Exemple : j\u2019importe une table, puis j\u2019ex\u00e9cute la proc\u00e9dure associ\u00e9e.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>PackageParameters<\/strong> : param\u00e8tres par d\u00e9faut au niveau package (source, cible, dates\u2026).\n<ul class=\"wp-block-list\">\n<li>Exemple : dans un traitement diff\u00e9rentiel, je stock la derni\u00e8re date de traitement et la r\u00e9injecte automatiquement lors de l\u2019ex\u00e9cution.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Scenarios<\/strong> : contextes d\u2019ex\u00e9cution (DAILY, BACKFILL, CLIENT_X\u2026).\n<ul class=\"wp-block-list\">\n<li>Exemple : certains clients g\u00e8rent plusieurs bases identiques. Le sc\u00e9nario permet de passer dynamiquement d\u2019un client \u00e0 l\u2019autre (connexion, serveur, etc.).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>ScenarioSteps<\/strong> : plan d\u2019ex\u00e9cution qui relie un sc\u00e9nario \u00e0 une suite de packages (ordre, retries, tol\u00e9rance aux erreurs).\n<ul class=\"wp-block-list\">\n<li>Gestion dynamique des \u00e9tapes, r\u00e9duction de l\u2019effort de maintenance.<\/li>\n\n\n\n<li>Au final : un simple job SQL Agent li\u00e9 \u00e0 cette table, simplifiant l\u2019exploitation.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>ScenarioParameters<\/strong> : surcharges de param\u00e8tres pour un sc\u00e9nario donn\u00e9.\n<ul class=\"wp-block-list\">\n<li>Exemple : un client peut demander un filtrage particulier (plage de dates, r\u00e8gles locales).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>ProcessRun<\/strong> : ent\u00eate de chaque ex\u00e9cution (statut global, dur\u00e9e, d\u00e9clencheur).\n<ul class=\"wp-block-list\">\n<li>Exemple : branchement Power BI pour suivi en temps r\u00e9el des traitements.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>ProcessRunStep<\/strong> : d\u00e9tail de chaque \u00e9tape reli\u00e9e au RunID (statut, dur\u00e9e, erreurs).\n<ul class=\"wp-block-list\">\n<li>Exemple : visualisation simple des erreurs dans Power BI, envoi d\u2019emails en cas de probl\u00e8me, rapport quotidien automatis\u00e9.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>Int\u00e9r\u00eat du mod\u00e8le SSIS :<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Pilotage dynamique : tout changement se fait en table, pas dans les packages.<\/li>\n\n\n\n<li>Logs centralis\u00e9s : un seul point de v\u00e9rit\u00e9 pour le suivi complet.<\/li>\n\n\n\n<li>Reporting int\u00e9gr\u00e9 : mise en place rapide de dashboards ou rapports automatis\u00e9s.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Le metadata-driven dans Fabric : la continuit\u00e9 naturelle<\/h3>\n\n\n\n<p>Avec Microsoft Fabric, je retrouve la m\u00eame philosophie que celle de SSIS : <strong>s\u00e9parer la logique technique de l\u2019orchestration.<\/strong><\/p>\n\n\n\n<p>La diff\u00e9rence : Fabric va beaucoup plus loin en termes de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>souplesse (param\u00e9trage),<\/li>\n\n\n\n<li>scalabilit\u00e9 (Spark, clusters dynamiques),<\/li>\n\n\n\n<li>observabilit\u00e9 (logs centralis\u00e9s exploitables).<\/li>\n<\/ul>\n\n\n\n<p><strong>Mod\u00e8le de tables Fabric \u2014 complet &amp; factoris\u00e9 :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/* =========================================================================\n   UNIT\u00c9S DE TRAVAIL (WorkUnits) = l\u2019\u00e9quivalent des packages SSIS\n   ========================================================================= *\/\nCREATE TABLE dbo.WorkUnits\n(\n    WorkUnitID   INT          IDENTITY(1,1) PRIMARY KEY,\n    WorkUnitName VARCHAR(128) NOT NULL,   -- ex : Load_Customers, Load_Sales\n    WorkType     VARCHAR(50)  NOT NULL,   -- COPY \/ SPARK_JOB \/ STORED_PROC\n    Target       VARCHAR(128) NULL,       -- Lakehouse, DWH, fichier\u2026\n    IsEnabled    BIT          NOT NULL DEFAULT (1),\n    CreatedAt    DATETIME2(0) NOT NULL DEFAULT (SYSUTCDATETIME()),\n    CONSTRAINT UQ_WorkUnits__Name UNIQUE (WorkUnitName)\n);\nGO\n\n\/* Param\u00e8tres par d\u00e9faut au niveau WorkUnit *\/\nCREATE TABLE dbo.WorkUnitParameters\n(\n    WorkUnitID   INT           NOT NULL FOREIGN KEY REFERENCES dbo.WorkUnits(WorkUnitID),\n    ParamName    VARCHAR(128)  NOT NULL,\n    DefaultValue VARCHAR(4000) NOT NULL,\n    CONSTRAINT PK_WorkUnitParameters PRIMARY KEY (WorkUnitID, ParamName)\n);\nGO\n\n\n\/* =========================================================================\n   SC\u00c9NARIOS (contextes d\u2019ex\u00e9cution) &amp; ORCHESTRATION\n   ========================================================================= *\/\nCREATE TABLE dbo.FabricScenarios\n(\n    ScenarioID       INT          IDENTITY(1,1) PRIMARY KEY,\n    ScenarioName     VARCHAR(100) NOT NULL,\n    Description      VARCHAR(400) NULL,\n    IsActive         BIT          NOT NULL DEFAULT (1),\n    ConcurrencyLevel INT          NULL,                  -- tuning possible par sc\u00e9nario\n    CreatedAt        DATETIME2(0) NOT NULL DEFAULT (SYSUTCDATETIME()),\n    CONSTRAINT UQ_FabricScenarios__Name UNIQUE (ScenarioName)\n);\nGO\n\nCREATE TABLE dbo.FabricScenarioSteps\n(\n    ScenarioStepID  INT          IDENTITY(1,1) PRIMARY KEY,\n    ScenarioID      INT          NOT NULL FOREIGN KEY REFERENCES dbo.FabricScenarios(ScenarioID),\n    WorkUnitID      INT          NOT NULL FOREIGN KEY REFERENCES dbo.WorkUnits(WorkUnitID),\n    ExecutionOrder  INT          NOT NULL,\n    IsActive        BIT          NOT NULL DEFAULT (1),\n    RetryCount      INT          NOT NULL DEFAULT (0),\n    ContinueOnError BIT          NOT NULL DEFAULT (0),\n    ClusterSize     VARCHAR(20)  NULL,                  -- Small \/ Medium \/ Large\n    SkipHeaderRows  INT          NULL,                  -- pratique pour les CSV\n    Comments        VARCHAR(400) NULL,\n    CONSTRAINT UQ_FabricSteps__Scenario_Order UNIQUE (ScenarioID, ExecutionOrder)\n);\nGO\n\n\/* Surcharges de param\u00e8tres par sc\u00e9nario \u2192 WorkUnit *\/\nCREATE TABLE dbo.FabricScenarioParameters\n(\n    ScenarioID INT           NOT NULL FOREIGN KEY REFERENCES dbo.FabricScenarios(ScenarioID),\n    WorkUnitID INT           NOT NULL FOREIGN KEY REFERENCES dbo.WorkUnits(WorkUnitID),\n    ParamName  VARCHAR(128)  NOT NULL,\n    ParamValue VARCHAR(4000) NOT NULL,\n    CONSTRAINT PK_FabricScenarioParameters PRIMARY KEY (ScenarioID, WorkUnitID, ParamName)\n);\nGO\n\n\/* Vue des param\u00e8tres effectifs *\/\nCREATE VIEW dbo.vw_FabricEffectiveParameters\nAS\nSELECT s.ScenarioID,\n       w.WorkUnitID,\n       wp.ParamName,\n       COALESCE(sp.ParamValue, wp.DefaultValue) AS EffectiveValue\n  FROM dbo.FabricScenarios          AS s\n       INNER JOIN dbo.FabricScenarioSteps      AS ss ON ss.ScenarioID = s.ScenarioID\n\t                                                AND ss.IsActive = 1\n       INNER JOIN dbo.WorkUnits                AS  w ON w.WorkUnitID = ss.WorkUnitID\n\t                                                AND w.IsEnabled = 1\n        LEFT JOIN dbo.WorkUnitParameters       AS wp ON wp.WorkUnitID = w.WorkUnitID\n        LEFT JOIN dbo.FabricScenarioParameters AS sp ON sp.ScenarioID = s.ScenarioID\n                                                    AND sp.WorkUnitID = w.WorkUnitID\n                                                    AND sp.ParamName  = wp.ParamName;\nGO\n\n\n\/* =========================================================================\n   LOGS CENTRALIS\u00c9S (ent\u00eate + d\u00e9tails steps)\n   ========================================================================= *\/\nCREATE TABLE dbo.FabricRun\n(\n    RunID        BIGINT       IDENTITY(1,1) PRIMARY KEY,\n    ScenarioName VARCHAR(100) NOT NULL,\n    Status       VARCHAR(20)  NOT NULL, -- Started \/ Succeeded \/ Failed \/ Partial\n    StartTime    DATETIME2(0) NOT NULL DEFAULT (SYSUTCDATETIME()),\n    EndTime      DATETIME2(0) NULL,\n    DurationSec  INT          NULL,\n    TriggeredBy  VARCHAR(128) NULL, -- utilisateur, service, API\n    ProcessID    UNIQUEIDENTIFIER NOT NULL DEFAULT (NEWID())\n);\nGO\n\nCREATE TABLE dbo.FabricRunStep\n(\n    RunStepID      BIGINT        IDENTITY(1,1) PRIMARY KEY,\n    RunID          BIGINT        NOT NULL FOREIGN KEY REFERENCES dbo.FabricRun(RunID),\n    ScenarioStepID INT           NULL, -- rattachement au mod\u00e8le\n    ScenarioName   VARCHAR(100)  NOT NULL,\n    WorkUnitName   VARCHAR(128)  NOT NULL,\n    Status         VARCHAR(20)   NOT NULL, -- Started \/ Succeeded \/ Failed \/ Skipped\n    StartTime      DATETIME2(0)  NOT NULL DEFAULT (SYSUTCDATETIME()),\n    EndTime        DATETIME2(0)  NULL,\n    DurationSec    INT           NULL,\n    Retries        INT           NOT NULL DEFAULT (0),\n    ErrorMessage   VARCHAR(2000) NULL\n);\nGO\n\nCREATE INDEX IX_FabricRun__StartTime    ON dbo.FabricRun     (StartTime DESC);\nCREATE INDEX IX_FabricRunStep__RunID    ON dbo.FabricRunStep (RunID);\nCREATE INDEX IX_FabricSteps__Scenario_Order ON dbo.FabricScenarioSteps (ScenarioID, ExecutionOrder);\nGO<\/code><\/pre>\n\n\n\n<p><strong>S\u00e9lection des steps pour un sc\u00e9nario<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT s.ScenarioName,\n       w.WorkUnitName,\n       w.WorkType,\n       w.Target,\n       fs.ExecutionOrder,\n       fs.SkipHeaderRows,\n       fs.ClusterSize\n  FROM dbo.FabricScenarioSteps AS fs\n       INNER JOIN dbo.FabricScenarios AS s ON s.ScenarioID = fs.ScenarioID\n\t                                      AND s.IsActive = 1\n       INNER JOIN dbo.WorkUnits       AS w ON w.WorkUnitID = fs.WorkUnitID\n\t                                      AND w.IsEnabled = 1\nWHERE s.ScenarioName = @ScenarioName\n  AND fs.IsActive     = 1\nORDER BY\n      fs.ExecutionOrder ASC;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Explication du mod\u00e8le Fabric<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>WorkUnits<\/strong> : \u00e9quivalent des packages SSIS. Une unit\u00e9 = 1 t\u00e2che (COPY, Spark, proc\u00e9dure).<\/li>\n\n\n\n<li><strong>WorkUnitParameters<\/strong> : param\u00e8tres par d\u00e9faut (source, cible, filtres).<\/li>\n\n\n\n<li><strong>FabricScenarios<\/strong> : contextes d\u2019ex\u00e9cution (DAILY, BACKFILL, CLIENT_X, TEST\u2026), avec parall\u00e9lisme possible.<\/li>\n\n\n\n<li><strong>FabricScenarioSteps<\/strong> : orchestration des \u00e9tapes (ordre, retries, tol\u00e9rance aux erreurs, taille de cluster, options).<\/li>\n\n\n\n<li><strong>FabricScenarioParameters<\/strong> : surcharges de param\u00e8tres (filtres sp\u00e9cifiques \u00e0 un client).<\/li>\n\n\n\n<li><strong>FabricRun<\/strong> : ent\u00eate de chaque ex\u00e9cution (statut global, dur\u00e9e, d\u00e9clencheur, ProcessID).<\/li>\n\n\n\n<li><strong>FabricRunStep<\/strong> : d\u00e9tail de chaque \u00e9tape (statut, dur\u00e9e, erreurs, reli\u00e9e au RunID).<\/li>\n<\/ul>\n\n\n\n<p>\ud83d\udc49 <strong>Int\u00e9r\u00eat (similaire \u00e0 SSIS, mais en mieux) :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>pilotage dynamique (tout en table, z\u00e9ro code dur),<\/li>\n\n\n\n<li>logs centralis\u00e9s avec ProcessID unique,<\/li>\n\n\n\n<li>scalabilit\u00e9 (taille de cluster, parall\u00e9lisme modulables),<\/li>\n\n\n\n<li>observabilit\u00e9 (liaison native avec Power BI).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Comparaison SSIS vs Fabric<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Crit\u00e8re<\/th><th>SSIS (Master Package)<\/th><th>Fabric (Metadata-driven)<\/th><\/tr><\/thead><tbody><tr><td>Unit\u00e9 de travail<\/td><td>Package enfant (.dtsx)<\/td><td>WorkUnit (COPY, Spark job, Stored Proc\u2026)<\/td><\/tr><tr><td>Param\u00e8tres<\/td><td>PackageParameters + ScenarioParameters<\/td><td>WorkUnitParameters + FabricScenarioParameters<\/td><\/tr><tr><td>Orchestration<\/td><td>Table ScenarioSteps + boucle Foreach<\/td><td>Table FabricScenarioSteps + Lookup + ForEach<\/td><\/tr><tr><td>Sc\u00e9narios<\/td><td>DAILY, BACKFILL, CLIENT_X<\/td><td>Idem + parall\u00e9lisme et tuning possible<\/td><\/tr><tr><td>Logs centralis\u00e9s<\/td><td>ProcessRun + ProcessRunStep<\/td><td>FabricRun + FabricRunStep (ProcessID unique)<\/td><\/tr><tr><td>Flexibilit\u00e9<\/td><td>Pilotage dynamique sans red\u00e9ploiement<\/td><td>+ \u00c9lasticit\u00e9 cloud<\/td><\/tr><tr><td>Observabilit\u00e9<\/td><td>Tables SQL + reporting custom (Power BI)<\/td><td>Nativement int\u00e9gr\u00e9 Power BI + monitoring<\/td><\/tr><tr><td>Scalabilit\u00e9<\/td><td>Limit\u00e9e au serveur SSIS<\/td><td>\u00c9lastique (clusters Spark, Fabric)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p>Que ce soit avec SSIS ou avec Fabric, mon approche reste la m\u00eame : <strong>s\u00e9parer la logique technique de l\u2019orchestration et piloter les traitements par des tables.<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Avec SSIS, le Master Package m\u2019a permis de factoriser mes flux, centraliser mes logs et donner de l\u2019autonomie \u00e0 mes clients.<\/li>\n\n\n\n<li>Avec Fabric, je pousse cette logique plus loin : WorkUnits remplacent les packages, les sc\u00e9narios pilotent toujours, mais les logs deviennent encore plus exploitables, notamment via Power BI.<\/li>\n<\/ul>\n\n\n\n<p>Ce que je d\u00e9fends, ce n\u2019est pas un outil en particulier, mais une <strong>philosophie<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00e9crire une fois,<\/li>\n\n\n\n<li>piloter par m\u00e9tadonn\u00e9es,<\/li>\n\n\n\n<li>donner aux \u00e9quipes visibilit\u00e9 et autonomie.<\/li>\n<\/ul>\n\n\n\n<p>C\u2019est cette approche qui, selon moi, fait la diff\u00e9rence entre un projet qui devient vite un cauchemar de maintenance, et un projet qui s\u2019adapte naturellement aux \u00e9volutions.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Organiser des flux, c\u2019est une question qui m\u2019a accompagn\u00e9 tout au long de ma carri\u00e8re. Quand j\u2019ai commenc\u00e9 avec les ETL, j\u2019ai appris \u201c\u00e0 l\u2019ancienne\u201d : toutes les r\u00e8gles de gestion cod\u00e9es directement dans les packages. Une approche rigide, lourde \u00e0 maintenir, et qui surtout cr\u00e9ait une d\u00e9pendance forte de mes clients envers moi. Assez [&hellip;]<\/p>\n","protected":false},"author":131,"featured_media":40344,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[294,955],"tags":[702,3669,2981],"type_dbi":[],"class_list":["post-40342","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-business-intelligence","category-cloud","tag-etl","tag-ms-fabric","tag-pipeline"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Metadata-driven pipelines : la continuit\u00e9 du Master Package SSIS - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Metadata-driven pipelines : la continuit\u00e9 du Master Package SSIS\" \/>\n<meta property=\"og:description\" content=\"Organiser des flux, c\u2019est une question qui m\u2019a accompagn\u00e9 tout au long de ma carri\u00e8re. Quand j\u2019ai commenc\u00e9 avec les ETL, j\u2019ai appris \u201c\u00e0 l\u2019ancienne\u201d : toutes les r\u00e8gles de gestion cod\u00e9es directement dans les packages. Une approche rigide, lourde \u00e0 maintenir, et qui surtout cr\u00e9ait une d\u00e9pendance forte de mes clients envers moi. Assez [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-25T09:54:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-25T09:59:17+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/09\/MS-Fabric.png\" \/>\n\t<meta property=\"og:image:width\" content=\"412\" \/>\n\t<meta property=\"og:image:height\" content=\"201\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Emmanuel Champel\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Emmanuel Champel\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/\"},\"author\":{\"name\":\"Emmanuel Champel\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/a30b0f642bef775f75929f3b8c751142\"},\"headline\":\"Metadata-driven pipelines : la continuit\u00e9 du Master Package SSIS\",\"datePublished\":\"2025-09-25T09:54:29+00:00\",\"dateModified\":\"2025-09-25T09:59:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/\"},\"wordCount\":1104,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/09\/MS-Fabric.png\",\"keywords\":[\"ETL\",\"MS Fabric\",\"Pipeline\"],\"articleSection\":[\"Business Intelligence\",\"Cloud\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/\",\"name\":\"Metadata-driven pipelines : la continuit\u00e9 du Master Package SSIS - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/09\/MS-Fabric.png\",\"datePublished\":\"2025-09-25T09:54:29+00:00\",\"dateModified\":\"2025-09-25T09:59:17+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/a30b0f642bef775f75929f3b8c751142\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/09\/MS-Fabric.png\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/09\/MS-Fabric.png\",\"width\":412,\"height\":201},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Metadata-driven pipelines : la continuit\u00e9 du Master Package SSIS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/a30b0f642bef775f75929f3b8c751142\",\"name\":\"Emmanuel Champel\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/c64e85e09f5c4198ada118bb7de3e573300eb219eac63021edf540288946b7ec?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c64e85e09f5c4198ada118bb7de3e573300eb219eac63021edf540288946b7ec?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c64e85e09f5c4198ada118bb7de3e573300eb219eac63021edf540288946b7ec?s=96&d=mm&r=g\",\"caption\":\"Emmanuel Champel\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/emmanuelchampel\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Metadata-driven pipelines : la continuit\u00e9 du Master Package SSIS - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/","og_locale":"en_US","og_type":"article","og_title":"Metadata-driven pipelines : la continuit\u00e9 du Master Package SSIS","og_description":"Organiser des flux, c\u2019est une question qui m\u2019a accompagn\u00e9 tout au long de ma carri\u00e8re. Quand j\u2019ai commenc\u00e9 avec les ETL, j\u2019ai appris \u201c\u00e0 l\u2019ancienne\u201d : toutes les r\u00e8gles de gestion cod\u00e9es directement dans les packages. Une approche rigide, lourde \u00e0 maintenir, et qui surtout cr\u00e9ait une d\u00e9pendance forte de mes clients envers moi. Assez [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/","og_site_name":"dbi Blog","article_published_time":"2025-09-25T09:54:29+00:00","article_modified_time":"2025-09-25T09:59:17+00:00","og_image":[{"width":412,"height":201,"url":"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/09\/MS-Fabric.png","type":"image\/png"}],"author":"Emmanuel Champel","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Emmanuel Champel","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/"},"author":{"name":"Emmanuel Champel","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/a30b0f642bef775f75929f3b8c751142"},"headline":"Metadata-driven pipelines : la continuit\u00e9 du Master Package SSIS","datePublished":"2025-09-25T09:54:29+00:00","dateModified":"2025-09-25T09:59:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/"},"wordCount":1104,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/09\/MS-Fabric.png","keywords":["ETL","MS Fabric","Pipeline"],"articleSection":["Business Intelligence","Cloud"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/","url":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/","name":"Metadata-driven pipelines : la continuit\u00e9 du Master Package SSIS - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/09\/MS-Fabric.png","datePublished":"2025-09-25T09:54:29+00:00","dateModified":"2025-09-25T09:59:17+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/a30b0f642bef775f75929f3b8c751142"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/09\/MS-Fabric.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/09\/MS-Fabric.png","width":412,"height":201},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/metadata-driven-pipelines-la-continuite-du-master-package-ssis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Metadata-driven pipelines : la continuit\u00e9 du Master Package SSIS"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/a30b0f642bef775f75929f3b8c751142","name":"Emmanuel Champel","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c64e85e09f5c4198ada118bb7de3e573300eb219eac63021edf540288946b7ec?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c64e85e09f5c4198ada118bb7de3e573300eb219eac63021edf540288946b7ec?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c64e85e09f5c4198ada118bb7de3e573300eb219eac63021edf540288946b7ec?s=96&d=mm&r=g","caption":"Emmanuel Champel"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/emmanuelchampel\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/40342","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/131"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=40342"}],"version-history":[{"count":2,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/40342\/revisions"}],"predecessor-version":[{"id":40347,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/40342\/revisions\/40347"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/40344"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=40342"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=40342"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=40342"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=40342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}