{"id":11759,"date":"2025-08-26T10:14:09","date_gmt":"2025-08-26T09:14:09","guid":{"rendered":"https:\/\/sparkle.consulting\/?p=11759"},"modified":"2026-07-09T18:03:12","modified_gmt":"2026-07-09T17:03:12","slug":"declarative-data-pipelines-in-fabric-with-materialized-lake-views","status":"publish","type":"post","link":"https:\/\/sparkle.consulting\/fr\/declarative-data-pipelines-in-fabric-with-materialized-lake-views\/","title":{"rendered":"Pipelines de donn\u00e9es d\u00e9claratifs dans Fabric avec les Materialized Lake Views"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"11759\" class=\"elementor elementor-11759\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a861a6c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a861a6c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3f5912a\" data-id=\"3f5912a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e6632b0 elementor-widget elementor-widget-text-editor\" data-id=\"e6632b0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>Pourquoi les Materialized Lake Views ?<\/strong><\/p><p>Les data engineers passent souvent trop de temps \u00e0 orchestrer des pipelines au lieu de transformer les donn\u00e9es. Les nouvelles Materialized Lake Views (MLV) de Microsoft Fabric changent la donne. Elles vous permettent de d\u00e9clarer les transformations en SQL, et Fabric prend automatiquement en charge la persistance, la planification du refresh, la lineage, le monitoring et m\u00eame la validation de la qualit\u00e9 des donn\u00e9es.<\/p><p>Microsoft d\u00e9crit les MLV comme des pipelines d\u00e9claratifs pour votre Lakehouse : vous dites <strong><em>ce que<\/em><\/strong> vous voulez, et Fabric g\u00e8re le <strong><em>comment.<\/em><\/strong><\/p><p>Contrairement aux pipelines traditionnels o\u00f9 vous devez construire vous-m\u00eame l'orchestration, la gestion des erreurs et les contr\u00f4les de qualit\u00e9, les MLV int\u00e8grent ces aspects by design. Avec de simples contraintes SQL, vous pouvez imposer des r\u00e8gles de qualit\u00e9 des donn\u00e9es (supprimer les enregistrements non valides ou arr\u00eater le pipeline en cas de violation), et Fabric g\u00e9n\u00e8re automatiquement des rapports et des insights de lineage pour les surveiller.<\/p><p>Nous avons explor\u00e9 cette fonctionnalit\u00e9 en d\u00e9tail et l'avons compar\u00e9e \u00e0 notre <a href=\"https:\/\/sparkle.consulting\/fr\/fabricignitepacks\/\"><strong>Fabric Ignite Framework<\/strong><\/a>, qui utilise dbt pour les transformations.<\/p><p>Les deux approches visent \u00e0 fournir des donn\u00e9es fiables et pr\u00eates pour l'analytique, mais elles diff\u00e8rent en termes d'effort de configuration, de flexibilit\u00e9 et de mod\u00e8le de gouvernance.<\/p><p>Ce blog offre un aper\u00e7u g\u00e9n\u00e9ral des MLV et de leur comparaison avec dbt.<\/p><p>Pour ceux qui souhaitent suivre en d\u00e9tail notre configuration \u00e9tape par \u00e9tape et nos sc\u00e9narios de test techniques, nous avons mis \u00e0 disposition la documentation technique compl\u00e8te <a href=\"#usecase\"><img decoding=\"async\" class=\"\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/1f449.svg\" alt=\"\ud83d\udc49\" width=\"20\" height=\"20\" data-wp-editing=\"1\" \/><\/a>\u00a0<\/p><p><strong>Comment fonctionnent les MLV ?<\/strong><\/p><ul><li>D\u00e9finies en SQL dans des notebooks ou l'UI (le support de PySpark est pr\u00e9vu).<\/li><li>Les r\u00e9sultats sont stock\u00e9s sous forme de Delta tables dans OneLake, optimis\u00e9s pour Power BI Direct Lake.<\/li><li>Suivi automatique de la lineage et orchestration des dataflows : aucune configuration manuelle de pipeline n\u00e9cessaire.<\/li><li>Contr\u00f4les de qualit\u00e9 des donn\u00e9es int\u00e9gr\u00e9s via des contraintes :<\/li><\/ul><p>ON MISMATCH FAIL : arr\u00eate l'ex\u00e9cution du pipeline.<\/p><p>ON MISMATCH DROP : ignore les lignes non valides mais poursuit l'ex\u00e9cution du pipeline.<br \/><img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/create-MLV.png\" alt=\"\" width=\"519\" height=\"144\" \/><\/p><p><b>Exemple : du Bronze au Gold<\/b><\/p><p><span lang=\"EN-US\">\u00c0 l'aide du dataset AdventureWorks, nous avons impl\u00e9ment\u00e9 une architecture Medallion classique avec des<br \/>MLV<\/span><\/p><p><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in; font-family: Symbol;\">\u00b7<span style=\"font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/span><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">Bronze :\u00a0<\/span><span style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">CSV bruts (ventes, adresses, cartes de cr\u00e9dit, personnes).\u00a0<\/span><\/p><p><span style=\"font-family: Symbol; font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">\u00b7<\/span><span style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';\">\u00a0 \u00a0 \u00a0 \u00a0<\/span><span style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">Silver :\u00a0<\/span><span style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">vues nettoy\u00e9es et enrichies, par ex.<\/span><\/p><p style=\"margin-left: 35.4pt; text-indent: 35.4pt;\"><span lang=\"EN-US\">addresses ajoute les noms State et Country.<\/span><\/p><p style=\"margin-left: 35.4pt; text-indent: 35.4pt;\"><span lang=\"EN-US\">creditcards joint le nom du titulaire depuis la table person.<\/span><\/p><p><span lang=\"EN-US\" style=\"font-size: 11.0pt; line-height: 107%; font-family: 'Aptos',sans-serif; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Aptos; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;\"><span style=\"font-size: 16px; font-style: inherit; font-weight: inherit; font-family: Symbol; text-indent: -0.25in;\">\u00b7<\/span><span style=\"font-style: inherit; font-weight: inherit; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; font-variant-emoji: normal; text-indent: -0.25in; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';\">\u00a0 \u00a0 \u00a0 \u00a0<\/span>Gold : orderheaders agr\u00e9g\u00e9s, combinant les donn\u00e9es de ventes avec les adresses enrichies et les infos de carte de cr\u00e9dit.<\/span><\/p><p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/bronze-to-gold-1024x1008.png\" alt=\"\" width=\"1024\" height=\"1008\" \/><\/p><p><b>Surveillance de la qualit\u00e9 des donn\u00e9es\u00a0<\/b><\/p><p><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in; font-family: Symbol;\">\u00b7<span style=\"font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><\/span><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">La vue lineage dans Fabric montre les d\u00e9pendances entre les MLV et g\u00e9n\u00e8re un pipeline ex\u00e9cutable.\u00a0<\/span><\/p><p><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in; font-family: Symbol;\">\u00b7<span style=\"font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><\/span><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">Les refreshes sont intelligents : si aucune donn\u00e9e source n'a chang\u00e9, l'ex\u00e9cution est ignor\u00e9e. (Actuellement full refresh uniquement ; le refresh incr\u00e9mental est sur la roadmap.)\u00a0<\/span><\/p><p><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in; font-family: Symbol;\">\u00b7<span style=\"font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><\/span><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">Monitoring int\u00e9gr\u00e9 via :<\/span><\/p><p style=\"margin-left: 35.4pt; text-indent: 35.4pt;\"><span lang=\"EN-US\">table sys_dq_metrics : enregistrements supprim\u00e9s, violations par contrainte.<\/span><\/p><p style=\"margin-left: 35.4pt; text-indent: 35.4pt;\"><span lang=\"EN-US\">Data Quality Reports g\u00e9n\u00e9r\u00e9s automatiquement : vue d'ensemble et d\u00e9tail par MLV.<\/span><\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/dataquality.png\" alt=\"\" width=\"510\" height=\"285\" \/><\/p><p><strong>Avantages des MLV<\/strong><\/p><p>Les MLV sont enti\u00e8rement cr\u00e9\u00e9es, soit dans l'UI de Fabric, soit sous forme de requ\u00eate SQL dans un Notebook. Fabric g\u00e8re tout le traitement backend pour vous (logique de refresh, gestion du pipeline bas\u00e9e sur les d\u00e9pendances entre les MLV et leurs sources, gestion des violations de r\u00e8gles de qualit\u00e9 des donn\u00e9es, scheduling, monitoring et reporting).<\/p><p>Les analystes et les professionnels de la donn\u00e9e n'ont qu'\u00e0 d\u00e9finir ce qu'ils veulent dans une requ\u00eate SQL (transformations, agr\u00e9gations, r\u00e8gles et actions de qualit\u00e9 des donn\u00e9es, etc.), sans avoir besoin d'infrastructure suppl\u00e9mentaire et\/ou de comp\u00e9tences d'ing\u00e9nierie.<\/p><p>Elles s'int\u00e8grent parfaitement dans l'\u00e9cosyst\u00e8me de Microsoft Fabric sans n\u00e9cessiter de d\u00e9veloppement manuel et\/ou de configuration complexe.<\/p><p>Les MLV sont mat\u00e9rialis\u00e9es, ce qui signifie que leur contenu est physiquement stock\u00e9 et peut \u00eatre interrog\u00e9 beaucoup plus rapidement que des vues standard. Une logique de refresh efficace (seules les MLV dont les donn\u00e9es source ont chang\u00e9 sont rafra\u00eechies) r\u00e9duit le temps de traitement et le co\u00fbt des ressources cloud. <em>(Remarque : prend actuellement en charge le full refresh ou l'absence de refresh ; le chargement incr\u00e9mental est pr\u00e9vu dans de futures mises \u00e0 jour.)<\/em><\/p><p><strong>Limites actuelles<\/strong><\/p><p>Il s'agit d'une premi\u00e8re version des MLV ; plusieurs fonctionnalit\u00e9s sont encore sur la roadmap pour de futures releases (comme le support de la syntaxe d\u00e9clarative pour PySpark (o\u00f9 seul le SQL peut \u00eatre utilis\u00e9 actuellement), les capacit\u00e9s d'incremental refresh, le support d'API pour la gestion des MLV, les fonctionnalit\u00e9s de lineage et d'ex\u00e9cution cross-lakehouse, etc.). Certaines restrictions s'appliquent \u00e0 l'utilisation de fonctions et \u00e0 la recherche de motifs avec des op\u00e9rateurs tels que LIKE ou regex dans les conditions de contrainte.<\/p><p>Une lineage de Materialized Lake Views cons\u00e9cutives est requise pour garantir que le DataFlow\/pipeline est g\u00e9n\u00e9r\u00e9 correctement ; les autres types de transformations ne seront pas pris en compte. Les tables sources doivent \u00e9galement \u00eatre charg\u00e9es via un autre type de transformation (et via leur propre pipeline) ; leur chargement ne fait pas partie du DataFlow\/schedule des MLV. Il n'existe qu'un seul DataFlow\/schedule de MLV, incluant <u>toutes les<\/u> MLV, m\u00eame si elles ne sont pas li\u00e9es entre elles. Il n'existe aucune possibilit\u00e9 de scinder le DataFlow\/schedule des MLV en, par exemple, des Subject Areas.<\/p><p>Des contr\u00f4les de qualit\u00e9 des donn\u00e9es en \u00e9chec entra\u00eenent l'une des actions suivantes : soit supprimer les enregistrements dont le contr\u00f4le de qualit\u00e9 \u00e9choue, soit arr\u00eater l'ex\u00e9cution de la MLV et des MLV suivantes. Ces 2 types d'actions sont toutefois surveill\u00e9s diff\u00e9remment (les MLV Runs dans la lineage n'afficheront que l'ex\u00e9cution en \u00e9chec des MLV due \u00e0 des erreurs DQ, tandis que la table sys_dq_metrics n'affichera que le nombre d'enregistrements supprim\u00e9s lors d'une ex\u00e9cution de MLV), ce qui rend le suivi plus difficile.<\/p><p>Ni framework de test, ni int\u00e9gration Git ne sont actuellement disponibles.<\/p><p><strong>Perspectives<\/strong><\/p><p>Les Materialized Lake Views sont encore jeunes, mais Microsoft les fait \u00e9voluer rapidement. L'incremental refresh et le support de PySpark sont d\u00e9j\u00e0 sur la roadmap. Une int\u00e9gration plus pouss\u00e9e avec Purview, Git et les API fait actuellement d\u00e9faut.<\/p><p>Aujourd'hui, les MLV sont d\u00e9j\u00e0 un excellent choix pour la livraison rapide de datasets curat\u00e9s dans Fabric, surtout en combinaison avec Power BI Direct Lake.<\/p><p>\u00c0 l'avenir, nous nous attendons \u00e0 ce que les MLV deviennent encore plus puissantes avec des capacit\u00e9s telles que :<\/p><ul><li>Un traitement incr\u00e9mental plus intelligent<\/li><li>Une qualit\u00e9 des donn\u00e9es et des tests int\u00e9gr\u00e9s plus riches<\/li><li>Une collaboration compl\u00e8te bas\u00e9e sur Git et un support CI\/CD<\/li><li>Une lineage cross-lakehouse pour le data mesh d'entreprise<\/li><li>Des optimisations de performance avec refresh adaptatif et caching<\/li><\/ul><p>Ces innovations \u00e9l\u00e8veront les MLV d'un facilitateur low-code \u00e0 une solution d'entreprise strat\u00e9gique pour l'analytics engineering avanc\u00e9.<\/p><p><strong>Fabric Ignite Framework avec dbt versus Fabric Materialized Lake Views<\/strong><\/p><p>Dans notre <a href=\"https:\/\/sparkle.consulting\/fr\/fabricignitepacks\/\">Fabric Ignite framework<\/a>, nous nous appuyons sur dbt pour g\u00e9rer les transformations. dbt nous offre des tests avanc\u00e9s, des workflows bas\u00e9s sur Git et des capacit\u00e9s matures d'incremental refresh : des fonctionnalit\u00e9s que les data engineers adorent pour construire des pipelines complexes et gouvern\u00e9s.<\/p><p>Avec l'arriv\u00e9e des Materialized Lake Views (MLV) dans Fabric, nous voyons d\u00e9sormais une alternative convaincante pour certains sc\u00e9narios. Les MLV brillent lorsque vous voulez une livraison rapide de datasets curat\u00e9s, une configuration minimale et une gouvernance native \u00e0 Fabric, tandis que dbt reste plus fort pour les mod\u00e8les incr\u00e9mentaux, les tests avanc\u00e9s et les bonnes pratiques CI\/CD.<\/p><p>En pratique, de nombreuses organisations combineront probablement les deux approches : utiliser les MLV pour les workloads low-code et natifs \u00e0 Fabric, tout en tirant parti de dbt l\u00e0 o\u00f9 la complexit\u00e9 d'ing\u00e9nierie, la portabilit\u00e9 et les pratiques DevOps sont essentielles.<\/p><p>Comparaison entre MLV et dbt :<\/p><table><tbody><tr><td width=\"142\"><p><strong>Fonctionnalit\u00e9 \/ besoin<\/strong><\/p><\/td><td width=\"242\"><p><strong>Materialized Lake Views (MLV)<\/strong><\/p><\/td><td width=\"221\"><p><strong>dbt<\/strong><\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Temps de configuration<\/strong><\/p><\/td><td width=\"242\"><p>Quelques minutes, enti\u00e8rement dans l'UI de Fabric<\/p><\/td><td width=\"221\"><p>N\u00e9cessite la configuration de dbt Core\/Cloud, un repo Git, des configs<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Incremental refresh<\/strong><\/p><\/td><td width=\"242\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/274c.svg\" alt=\"\u274c\" \/>\u00a0(full refresh uniquement, incr\u00e9mental pr\u00e9vu)<\/p><\/td><td width=\"221\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0Mod\u00e8les incr\u00e9mentaux natifs<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Int\u00e9gration de la gouvernance<\/strong><\/p><\/td><td width=\"242\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0Monitoring complet de la lineage Fabric\/Purview<\/p><\/td><td width=\"221\"><p>Partiel : n\u00e9cessite une int\u00e9gration suppl\u00e9mentaire<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Gestion des d\u00e9pendances<\/strong><\/p><\/td><td width=\"242\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0Auto-refresh bas\u00e9 sur la lineage au sein de Fabric<\/p><\/td><td width=\"221\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0DAG explicite via ref()<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Framework de test<\/strong><\/p><\/td><td width=\"242\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/274c.svg\" alt=\"\u274c\" \/>\u00a0Aucun int\u00e9gr\u00e9<\/p><\/td><td width=\"221\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0Tests int\u00e9gr\u00e9s + personnalis\u00e9s \u00e9tendus<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Contr\u00f4le de version<\/strong><\/p><\/td><td width=\"242\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/274c.svg\" alt=\"\u274c\" \/>\u00a0Pas d'int\u00e9gration Git<\/p><\/td><td width=\"221\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0Workflows natifs Git<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Cross-platform<\/strong><\/p><\/td><td width=\"242\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/274c.svg\" alt=\"\u274c\" \/>\u00a0Fabric uniquement<\/p><\/td><td width=\"221\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0De nombreux warehouses + lakehouses pris en charge<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Courbe d'apprentissage<\/strong><\/p><\/td><td width=\"242\"><p>Faible (ax\u00e9 SQL)<\/p><\/td><td width=\"221\"><p>Plus \u00e9lev\u00e9e (YAML, Jinja, CLI, Git)<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Id\u00e9al pour<\/strong><\/p><\/td><td width=\"242\"><p>Transformations simples \u00e0 moyennes dans le Lakehouse, enti\u00e8rement g\u00e9r\u00e9es par Fabric<\/p><\/td><td width=\"221\"><p>Transformations complexes et ing\u00e9nier\u00e9es, CI\/CD, multi-plateforme<\/p><\/td><\/tr><\/tbody><\/table>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9212258 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"9212258\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-baefa18 elementor-widget elementor-widget-menu-anchor\" data-id=\"baefa18\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"menu-anchor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-menu-anchor\" id=\"usecase\"><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a03d456 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"a03d456\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"font-style: inherit;\"><b>Cas d'usage<\/b><\/span><\/p><p><span style=\"font-style: inherit;\"><span style=\"font-weight: inherit;\">Un cas d'usage a \u00e9t\u00e9 mis en place selon l'architecture medallion en organisant les donn\u00e9es en trois couches :<\/span><\/span><\/p><ul><li>bronze (donn\u00e9es brutes)<\/li><li>silver (donn\u00e9es nettoy\u00e9es et enrichies)<\/li><li>gold (donn\u00e9es agr\u00e9g\u00e9es et analys\u00e9es).<\/li><\/ul><p>Certaines tables du sch\u00e9ma OLTP AdventureWorks 2008 (une base de donn\u00e9es exemple pour Microsoft SQL Server) seront utilis\u00e9es comme source pour ce cas d'usage. Ces tables ont \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9es sous forme de fichiers CSV et charg\u00e9es en tant que Delta Table dans une <strong>Bronze<\/strong> couche Bronze de Fabric :<\/p><table><tbody><tr><td width=\"205\"><p><strong>Table<\/strong><\/p><\/td><td width=\"205\"><p><strong>Description<\/strong><\/p><\/td><td width=\"205\"><p><strong>Delta Table dans la couche Bronze de Fabric<\/strong><\/p><\/td><\/tr><tr><td width=\"205\"><p>Sales.SalesOrderHeader<\/p><\/td><td width=\"205\"><p>Informations g\u00e9n\u00e9rales sur les commandes de vente.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.salesorderheader<\/p><\/td><\/tr><tr><td width=\"205\"><p>Person.Address<\/p><\/td><td width=\"205\"><p>Informations d'adresse postale pour les clients, employ\u00e9s et fournisseurs.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.address<\/p><\/td><\/tr><tr><td width=\"205\"><p>Person.StateProvince<\/p><\/td><td width=\"205\"><p>Table de recherche des \u00e9tats et provinces.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.stateprovince<\/p><\/td><\/tr><tr><td width=\"205\"><p>Person.CountryRegion<\/p><\/td><td width=\"205\"><p>Table de recherche contenant les codes ISO standard des pays et r\u00e9gions.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.countryregion<\/p><\/td><\/tr><tr><td width=\"205\"><p>Sales.CreditCard<\/p><\/td><td width=\"205\"><p>Informations de carte de cr\u00e9dit des clients.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.creditcard<\/p><\/td><\/tr><tr><td width=\"205\"><p>Sales.PersonCreditCard<\/p><\/td><td width=\"205\"><p>Table de correspondance reliant les personnes \u00e0 leurs informations de carte de cr\u00e9dit dans la table CreditCard.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.personcreditcard<\/p><\/td><\/tr><tr><td width=\"205\"><p>Person.Person<\/p><\/td><td width=\"205\"><p>Personnes impliqu\u00e9es avec AdventureWorks : employ\u00e9s, contacts clients et contacts fournisseurs.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.person<\/p><\/td><\/tr><\/tbody><\/table><p>Le DataModel de la couche Bronze :<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-11770 size-full\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/bronzlayerdatamodel.png\" alt=\"\" width=\"605\" height=\"293\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/bronzlayerdatamodel.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/bronzlayerdatamodel-300x145.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p><em>Remarque : les relations de tables ci-dessus ont \u00e9t\u00e9 ajout\u00e9es au DataModel apr\u00e8s la cr\u00e9ation des MLV (voir \u00e9tapes suivantes) afin de rendre le DataModel plus visuel. Elles ne sont pas n\u00e9cessaires et\/ou utilis\u00e9es par Fabric pour configurer les MLV.<\/em><\/p><p>Dans la <strong>Silver<\/strong> couche Silver, 2 tables enrichies\/nettoy\u00e9es seront mises en place. Elles sont cr\u00e9\u00e9es en tant que Materialized Lake Views :<\/p><ul><li><strong>addresses<\/strong> Toutes les adresses de la table source address seront enrichies avec le StateProvince Name et le CountryRegion Name r\u00e9cup\u00e9r\u00e9s dans les tables sources appropri\u00e9es.<\/li><li><strong>creditcards<\/strong>\u00a0<b>&#8211;<\/b> Toutes les cartes de cr\u00e9dit de la table source creditcard seront enrichies avec le nom du titulaire de la carte, d\u00e9riv\u00e9 de la table source persons.<\/li><\/ul><p>Afin de d\u00e9montrer les capacit\u00e9s de qualit\u00e9 des donn\u00e9es int\u00e9gr\u00e9es des MLV, certaines contraintes sont d\u00e9finies :<\/p><ul><li><strong>addresses<\/strong> Toutes les adresses doivent avoir un StateProvince Name et un CountryRegion Name. S'ils ne peuvent pas \u00eatre d\u00e9riv\u00e9s des tables sources appropri\u00e9es, la MLV ne doit pas \u00eatre mise \u00e0 jour et le pipeline doit s'arr\u00eater en \u00e9chec.<\/li><li><strong>creditcards\u00a0<\/strong>Toutes les cartes de cr\u00e9dit doivent avoir un Number, un Expiry Month et un Expiry Year. S'ils ne peuvent pas \u00eatre d\u00e9riv\u00e9s de la table source appropri\u00e9e, ces cartes de cr\u00e9dit ne doivent pas \u00eatre incluses dans la MLV, mais l'ex\u00e9cution du pipeline peut continuer.<\/li><\/ul><p>Scripts de cr\u00e9ation des MLV dans la couche Silver de Fabric :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4245b3a elementor-widget elementor-widget-code-highlight\" data-id=\"4245b3a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>CREATE MATERIALIZED LAKE VIEW IF NOT EXISTS adventureworks_silver.addresses\r\n               (\r\n     CONSTRAINT stateprovince_chk CHECK (StateProvince IS NOT NULL) ON MISMATCH FAIL,\r\n     CONSTRAINT countryregion_chk CHECK (CountryRegion IS NOT NULL) ON MISMATCH FAIL\r\n               )\r\n             AS\r\n         SELECT ad.AddressID,\r\n                ad.AddressLine1,\r\n                ad.AddressLine2,\r\n                ad.City,\r\n                ad.PostalCode,\r\n                sp.Name StateProvince,\r\n                cr.Name CountryRegion\r\n           FROM adventureworks_bronze.address          ad \r\nLEFT OUTER JOIN adventureworks_bronze.stateprovince    sp \r\n             ON ad.StateProvinceID = sp.StateProvinceID\r\nLEFT OUTER JOIN adventureworks_bronze.countryregion    cr \r\n             ON sp.CountryRegionCode = cr.CountryRegionCode;\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-54220b1 elementor-widget elementor-widget-code-highlight\" data-id=\"54220b1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>\r\n         CREATE MATERIALIZED LAKE VIEW IF NOT EXISTS adventureworks_silver.creditcards\r\n               (\r\n     CONSTRAINT cardnumber_chk      CHECK (CardNumber IS NOT NULL) ON MISMATCH DROP,\r\n     CONSTRAINT expirationmonth_chk CHECK (ExpMonth IS NOT NULL)   ON MISMATCH DROP,\r\n     CONSTRAINT expirationyear_chk  CHECK (ExpYear IS NOT NULL)    ON MISMATCH DROP\r\n               )\r\n             AS\r\n         SELECT crd.CreditCardID,\r\n                crd.CardNumber,\r\n                crd.ExpMonth,\r\n                crd.ExpYear,\r\n                prs.FirstName,\r\n                prs.LastName\r\n           FROM adventureworks_bronze.creditcard        crd \r\nLEFT OUTER JOIN adventureworks_bronze.personcreditcard  pcc\r\n             ON crd.CreditCardID = pcc.CreditCardID\r\nLEFT OUTER JOIN adventureworks_bronze.person            prs \r\n             ON pcc.BusinessEntityID = prs.BusinessEntityID;   \r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6077265 elementor-widget elementor-widget-text-editor\" data-id=\"6077265\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><span style=\"font-style: inherit; font-weight: inherit;\">Dans la\u00a0<\/span><span style=\"font-weight: bold; font-style: inherit;\">Gold<\/span><span style=\"font-style: inherit; font-weight: inherit;\">\u00a0couche Gold, une table agr\u00e9g\u00e9e sera mise en place. La table est \u00e9galement cr\u00e9\u00e9e en tant que Materialized Lake View :<\/span><\/p><ul style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><li style=\"font-size: 16px;\"><span style=\"font-weight: bold;\">orderheaders\u00a0<\/span>combinera les donn\u00e9es sources de la Sales Header avec les adresses Shipping et Billing ainsi que les donn\u00e9es Creditcard (toutes stock\u00e9es dans des MLV de la couche Silver).<\/li><\/ul><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Des contraintes sont d\u00e9finies pour garantir que l'adresse Shipping et l'adresse Billing existent toutes deux ; si ce n'est pas le cas, les enregistrements Sales Header ne doivent pas \u00eatre inclus dans la MLV, mais l'ex\u00e9cution du pipeline peut continuer<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Scripts de cr\u00e9ation de la MLV dans la couche Gold de Fabric :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d6b6c3e elementor-widget elementor-widget-code-highlight\" data-id=\"d6b6c3e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>CREATE MATERIALIZED LAKE VIEW IF NOT EXISTS adventureworks_gold.orderheaders\r\n               (\r\n     CONSTRAINT shiptoaddress_chk CHECK (Bill_To_AddressId IS NOT NULL) ON MISMATCH DROP,\r\n     CONSTRAINT billtoaddress_chk CHECK (Ship_To_AddressId IS NOT NULL) ON MISMATCH DROP\r\n               )\r\n             AS\r\n         SELECT soh.SalesOrderNumber,\r\n                soh.OrderDate,\r\n                soh.ShipDate,\r\n                soh.DueDate,\r\n                soh.Status,\r\n                soh.SubTotal,\r\n                soh.TaxAmt,\r\n                soh.Freight,\r\n                soh.TotalDue,\r\n                bta.AddressID Bill_To_AddressId,\r\n                bta.AddressLine1 Bill_To_AddressLine1,\r\n                bta.AddressLine2 Bill_To_AddressLine2,\r\n                bta.City Bill_To_City,\r\n                bta.PostalCode Bill_To_PostalCode,\r\n                bta.StateProvince Bill_To_StateProvince,\r\n                bta.CountryRegion Bill_To_CountryRegion,\r\n                sta.AddressID Ship_To_AddressId,\r\n                sta.AddressLine1 Ship_To_AddressLine1,\r\n                sta.AddressLine2 Ship_To_AddressLine2,\r\n                sta.City Ship_To_City,\r\n                sta.PostalCode Ship_To_PostalCode,\r\n                sta.StateProvince Ship_To_StateProvince,\r\n                sta.CountryRegion Ship_To_CountryRegion,\r\n                crd.CardNumber,\r\n                crd.ExpMonth,\r\n                crd.ExpYear,\r\n                crd.FirstName,\r\n                crd.LastName\r\n           FROM adventureworks_bronze.salesorderheader soh\r\nLEFT OUTER JOIN adventureworks_silver.addresses        bta \r\n             ON soh.BillToAddressID = bta.AddressID\r\nLEFT OUTER JOIN adventureworks_silver.addresses        sta \r\n             ON soh.ShipToAddressID = sta.AddressID   \r\nLEFT OUTER JOIN adventureworks_silver.creditcards      crd \r\n             ON soh.CreditCardID = crd.CreditCardID;   \r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9adbb7c elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"9adbb7c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><em style=\"font-weight: inherit;\">Remarque : les attributs utilis\u00e9s par les contraintes doivent \u00eatre d\u00e9finis dans l'instruction SELECT. Dans l'exemple ci-dessus, Bill To AddressId et Ship To AddressId ne sont ajout\u00e9s que pour \u00eatre utilis\u00e9s par la contrainte, ils n'ont aucune business value. Toutefois, faire r\u00e9f\u00e9rence \u00e0 bta.AddressID ou sta.AddressID dans les contraintes entra\u00eenera une erreur).<\/em><\/p><p>Une fois les MLV cr\u00e9\u00e9es, une Data Lineage View est g\u00e9n\u00e9r\u00e9e automatiquement. Pour acc\u00e9der \u00e0 cette vue, naviguez vers le Lakehouse et s\u00e9lectionnez Managed Materialized Lake View :<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11780 aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/mmlv.png\" alt=\"\" width=\"605\" height=\"386\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/mmlv.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/mmlv-300x191.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p>Les MLV elles-m\u00eames sont \u00e9galement stock\u00e9es sous forme de Delta Tables et se retrouvent en tant que telles dans la section Tables du Lakehouse.<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11781 aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/autogenlineage.png\" alt=\"\" width=\"605\" height=\"552\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/autogenlineage.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/autogenlineage-300x274.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p>Cette lineage g\u00e9n\u00e9r\u00e9e automatiquement peut \u00eatre planifi\u00e9e comme un pipeline.<\/p><p>Notez cependant :<\/p><ul><li>Seules les MLV sont rafra\u00eechies. Le rafra\u00eechissement des donn\u00e9es dans les Delta Tables de la couche Bronze doit dans l'exemple ci-dessus se faire d'une autre mani\u00e8re et ne peut pas \u00eatre int\u00e9gr\u00e9 dans le pipeline g\u00e9n\u00e9r\u00e9 automatiquement. Il en va de m\u00eame si, par exemple, d'autres tables de donn\u00e9es dans l'une des couches doivent \u00eatre manipul\u00e9es.<\/li><li>Toutes les MLV, m\u00eame si elles n'appartiennent pas \u00e0 la m\u00eame data lineage, font partie de la m\u00eame Data Lineage View\/pipeline. La partie sup\u00e9rieure de la data lineage pr\u00e9sent\u00e9e ci-dessous est celle du cas d'usage utilis\u00e9 dans ce blog, la partie inf\u00e9rieure est un autre cas d'usage. Les deux ne partagent aucun objet.<\/li><\/ul><p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11782 aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/lineg2.png\" alt=\"\" width=\"533\" height=\"321\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/lineg2.png 533w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/lineg2-300x181.png 300w\" sizes=\"(max-width: 533px) 100vw, 533px\" \/>S\u00e9lectionnez\u00a0<strong style=\"font-style: inherit;\">Schedule<\/strong><span style=\"font-style: inherit; font-weight: inherit;\"> dans le ruban de navigation afin de cr\u00e9er et\/ou maintenir le scheduling du pipeline MLV :<\/span><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11783 aligncenter\" style=\"font-style: inherit; font-weight: inherit;\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/schedule.png\" alt=\"\" width=\"605\" height=\"320\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/schedule.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/schedule-300x159.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/>Le menu d\u00e9roulant en haut \u00e0 gauche liste les ex\u00e9cutions actuelles et historiques, et doit \u00eatre utilis\u00e9 pour surveiller\/d\u00e9panner les ex\u00e9cutions du pipeline.<br \/><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11784\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/viewlineage.png\" alt=\"\" width=\"484\" height=\"203\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/viewlineage.png 484w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/viewlineage-300x126.png 300w\" sizes=\"(max-width: 484px) 100vw, 484px\" \/><br \/>Cliquer sur une activit\u00e9 dans la partie lineage de l'\u00e9cran ou sur la liste d'activit\u00e9s en bas de l'\u00e9cran affichera plus de d\u00e9tails sur l'ex\u00e9cution\/les erreurs\/etc.<br \/><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11785 aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/errors.png\" alt=\"\" width=\"605\" height=\"311\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/errors.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/errors-300x154.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p>Remarques :<\/p><ul><li>Toutes les MLV sont dans le m\u00eame pipeline (voir remarque pr\u00e9c\u00e9dente). Toutes les MLV sans d\u00e9pendance d'entr\u00e9e d'une autre MLV sont d\u00e9marr\u00e9es simultan\u00e9ment, et \u00e0 partir de ce point, les d\u00e9pendances d\u00e9terminent le chemin \u00e0 suivre.<\/li><li>Aucune trace des enregistrements supprim\u00e9s en raison des contraintes de qualit\u00e9 des donn\u00e9es ne peut \u00eatre trouv\u00e9e sur les activit\u00e9s ; elles seront consid\u00e9r\u00e9es comme termin\u00e9es, sans aucun avertissement ni indication.<\/li><\/ul><p><strong>\u00a0<\/strong><\/p><p><strong>Sc\u00e9narios<\/strong><\/p><p>Pour le cas d'usage, un certain nombre de sc\u00e9narios seront mis en place afin de d\u00e9montrer les diff\u00e9rentes fonctionnalit\u00e9s des MLV.<\/p><p>Les donn\u00e9es fournies par Microsoft pour le sch\u00e9ma OLTP AdventureWorks 2008 ne contiennent aucun \u00e9cart par rapport aux r\u00e8gles de qualit\u00e9 des donn\u00e9es sp\u00e9cifi\u00e9es :<\/p><ul><li>Tous les enregistrements OrderHeader ont un Bill To AddressId et un Ship To AddressId.<\/li><li>Toutes les adresses peuvent \u00eatre li\u00e9es \u00e0 un StateProvince Name et un CountryRegion Name.<\/li><li>Toutes les cartes de cr\u00e9dit peuvent \u00eatre li\u00e9es \u00e0 une personne.<\/li><\/ul><p>Contr\u00f4les de qualit\u00e9 des donn\u00e9es initiaux :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fa2d0e4 elementor-widget elementor-widget-code-highlight\" data-id=\"fa2d0e4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>SELECT COUNT(*)\r\n           FROM adventureworks_bronze.salesorderheader soh;\r\n             -- 31.465 Records\r\n\r\n             -- All OrderHeader records have a Bill_To_AddressId and a Ship_To_AddressId\r\n         SELECT COUNT(*)\r\n           FROM adventureworks_bronze.salesorderheader soh\r\n           JOIN adventureworks_bronze.address          bta \r\n             ON soh.BillToAddressID = bta.AddressID\r\n           JOIN adventureworks_bronze.address          sta \r\n             ON soh.ShipToAddressID = sta.AddressID;  \r\n             -- 31.465 Records\r\n\r\n         SELECT COUNT(*)\r\n           FROM adventureworks_bronze.address;\r\n             -- 19.164 Records\r\n\r\n             -- All Addresses can be linked to a StateProvince Name and a CountryRegion Name\r\n         SELECT COUNT(*)\r\n           FROM adventureworks_bronze.address          ad \r\n           JOIN adventureworks_bronze.stateprovince    sp \r\n             ON ad.StateProvinceID = sp.StateProvinceID\r\n           JOIN adventureworks_bronze.countryregion    cr \r\n             ON sp.CountryRegionCode = cr.CountryRegionCode\r\n          WHERE sp.Name IS NOT NULL\r\n            AND cr.Name IS NOT NULL;\r\n             -- 19.164 Records\r\n\r\n         SELECT COUNT(*)\r\n           FROM adventureworks_bronze.creditcard        cc\r\n             -- 19.118 Records\r\n\r\n             -- All Credit Cards can be linked to a Person\r\n         SELECT COUNT(*)\r\n           FROM adventureworks_bronze.creditcard        cc\r\n           JOIN adventureworks_bronze.personcreditcard  pcc\r\n             ON cc.CreditCardID = pcc.CreditCardID\r\n           JOIN adventureworks_bronze.person            prs \r\n             ON pcc.BusinessEntityID = prs.BusinessEntityID\r\n          WHERE prs.FirstName IS NOT NULL\r\n            AND prs.LastName IS NOT NULL;\r\n             -- 19.118 Records\r\n   \r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c94714c elementor-widget elementor-widget-text-editor\" data-id=\"c94714c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><span style=\"font-weight: bold; font-style: inherit;\">Scenario 1<\/span><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Il s'agit de l'Initial Load, sans \u00e9cart dans la qualit\u00e9 des donn\u00e9es (voir ci-dessus).<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Le schedule des MLV s'ex\u00e9cute avec succ\u00e8s :<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-11790\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/mlvschedule.png\" alt=\"\" width=\"18002\" height=\"22822\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/mlvschedule.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/mlvschedule-237x300.png 237w\" sizes=\"(max-width: 18002px) 100vw, 18002px\" \/><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">La table sys_dq_metrics peut \u00eatre utilis\u00e9e pour surveiller le nombre d'enregistrements charg\u00e9s. Elle fait r\u00e9f\u00e9rence \u00e0 des m\u00e9triques de qualit\u00e9 des donn\u00e9es au niveau syst\u00e8me, utilis\u00e9es pour mesurer et surveiller la qualit\u00e9 des donn\u00e9es dans une base de donn\u00e9es ou un pipeline de donn\u00e9es. Ces m\u00e9triques aident \u00e0 garantir que les donn\u00e9es sont exactes, compl\u00e8tes, coh\u00e9rentes et fiables pour la prise de d\u00e9cision.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-da46b1c elementor-widget elementor-widget-code-highlight\" data-id=\"da46b1c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>SELECT top(100) \r\n                Namespace,\r\n                MLVName,\r\n                RefreshPolicy,\r\n                RefreshTimestamp,\r\n                Message,\r\n                TotalRowsProcessed,\r\n                TotalRowsDropped,\r\n                TotalViolations,\r\n                ViolationsPerConstraint\r\n           FROM dbo.sys_dq_metrics\r\n          WHERE MLVName in ('orderheaders','addresses','creditcards')\r\n       ORDER BY RefreshTimestamp DESC; \r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-25a64fb elementor-widget elementor-widget-text-editor\" data-id=\"25a64fb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Dans cette table, les enregistrements suivants se r\u00e9f\u00e8rent au Sc\u00e9nario 1 :<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11795\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScen1.jpg\" alt=\"\" width=\"944\" height=\"438\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScen1.jpg 944w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScen1-300x139.jpg 300w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScen1-768x356.jpg 768w\" sizes=\"(max-width: 944px) 100vw, 944px\" \/><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Le Total Rows Processed pour chaque MLV correspond au nombre d'enregistrements dans leurs driving tables (salesorderheader, address et creditcard dans la couche Bronze).<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Aucune ligne n'a \u00e9t\u00e9 supprim\u00e9e, aucune violation n'a \u00e9t\u00e9 trouv\u00e9e.<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><span style=\"font-weight: bold;\">Scenario 2<\/span><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Sans rien changer au contenu de la couche Bronze, le schedule des MLV est red\u00e9marr\u00e9<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Le schedule des MLV s'ex\u00e9cute avec succ\u00e8s :<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11796\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2.png\" alt=\"\" width=\"605\" height=\"770\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2-236x300.png 236w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Dans la table sys_dq_metrics, les enregistrements suivants se r\u00e9f\u00e8rent au Sc\u00e9nario 2 :<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-11797\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2table-1024x545.jpg\" alt=\"\" width=\"1024\" height=\"545\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2table-1024x545.jpg 1024w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2table-300x160.jpg 300w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2table-768x409.jpg 768w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2table.jpg 1057w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Le Total Rows Processed pour chaque MLV est 0. Aucune ligne n'a \u00e9t\u00e9 supprim\u00e9e, aucune violation n'a \u00e9t\u00e9 trouv\u00e9e.<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Le syst\u00e8me d\u00e9tecte qu'aucune modification n'a \u00e9t\u00e9 apport\u00e9e aux donn\u00e9es source utilis\u00e9es par les MLV. La RefreshPolicy est<em>NoRefresh<\/em>, et le Message est<em>Aucune mise \u00e0 jour de donn\u00e9es dans la table source dont d\u00e9pend la MLV, et donc aucun refresh n'a \u00e9t\u00e9 effectu\u00e9<\/em>\u2019.<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Cela prouve que seules les parties de la lineage qui ont chang\u00e9 seront rafra\u00eechies. Notez toutefois qu'aucun chargement incr\u00e9mental n'est actuellement pris en charge ; soit un full refresh de la MLV se produit, soit aucun refresh.<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><span style=\"font-weight: bold;\">Scenario 3<\/span><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Nous allons forcer un probl\u00e8me de qualit\u00e9 des donn\u00e9es en mettant \u00e0 jour un CountryRegionCode dans la table countryregion de la couche Bronze. Cela entra\u00eenera un CountryRegion vide dans la MLV addresses de la couche Silver, violant la contrainte countryregion_chk dans cette MLV.<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">L'instruction SQL Data Manipulation Language (DML) suivante est ex\u00e9cut\u00e9e pour forcer le probl\u00e8me de qualit\u00e9 des donn\u00e9es :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-12f2f38 elementor-widget elementor-widget-code-highlight\" data-id=\"12f2f38\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>UPDATE adventureworks_bronze.countryregion\r\n            SET CountryRegionCode = 'FR_'\r\n          WHERE CountryRegionCode = 'FR'; \r\n\r\n             -- Number of affected rows = 1\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ccf365 elementor-widget elementor-widget-text-editor\" data-id=\"0ccf365\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Le schedule des MLV ne s'ex\u00e9cute pas avec succ\u00e8s :<\/li><\/ul><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11799\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/schedulerun3.png\" alt=\"\" width=\"605\" height=\"758\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/schedulerun3.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/schedulerun3-239x300.png 239w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><ul style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><li style=\"font-size: 16px;\">La MLV creditcards s'ex\u00e9cute avec succ\u00e8s ;<\/li><li style=\"font-size: 16px;\">La MLV addresses \u00e9choue en raison de la violation de la contrainte countryregion_chk dans cette MLV, alors que le param\u00e8tre ON MISMATCH de cette contrainte est r\u00e9gl\u00e9 sur FAIL. L'error log affiche :<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11800\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/errorlog.png\" alt=\"\" width=\"296\" height=\"90\" \/><\/li><li style=\"font-size: 16px;\">Le pipeline s'arr\u00eate en raison de la violation de qualit\u00e9 des donn\u00e9es ; la MLV orderheaders ne s'ex\u00e9cutera pas<\/li><\/ul><p><br \/>La table sys_dq_metrics ne contient aucun enregistrement pour les MLV qui ont \u00e9chou\u00e9 ou n'ont pas \u00e9t\u00e9 ex\u00e9cut\u00e9es, donc la seule entr\u00e9e pour le Sc\u00e9nario 3 est :<\/p><p style=\"font-size: 16px;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-11801\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScan4-1024x229.jpg\" alt=\"\" width=\"1024\" height=\"229\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScan4-1024x229.jpg 1024w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScan4-300x67.jpg 300w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScan4-768x171.jpg 768w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScan4.jpg 1062w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p><p style=\"font-size: 16px;\">Remarque :<br \/>Les contraintes en \u00e9chec semblent chronophages. Pendant mes tests, la MLV addresses en \u00e9chec a pris plus de 5 minutes :<\/p><p style=\"font-size: 16px;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11802\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/runtime.png\" alt=\"\" width=\"605\" height=\"45\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/runtime.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/runtime-300x22.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p style=\"font-size: 16px;\">alors que le chargement initial (Sc\u00e9nario 1, chargement de 19 614 adresses) n'a pris que 43 secondes. Des tests ant\u00e9rieurs avec la m\u00eame MLV ont montr\u00e9 des r\u00e9sultats similaires (&gt; 5 minutes en cas de violations de contrainte) :<\/p><p style=\"font-size: 16px;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11803\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/runtim2.png\" alt=\"\" width=\"605\" height=\"41\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/runtim2.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/runtim2-300x20.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p style=\"font-size: 16px;\"><span style=\"font-weight: bold;\">\u00a0<\/span><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><span style=\"font-weight: bold;\">Scenario 4<\/span><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Nous allons r\u00e9soudre \u00e0 nouveau le probl\u00e8me de qualit\u00e9 des donn\u00e9es CountryRegionCode et forcer un autre probl\u00e8me de qualit\u00e9 des donn\u00e9es en mettant \u00e0 jour l'Expiration Month dans la table creditcard de la couche Bronze (tous les Expiration Months = 1 seront chang\u00e9s en null). Cela entra\u00eenera un ExpMonth vide dans la MLV creditcards de la couche Silver, violant la contrainte expirationmonth_chk dans cette MLV.<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Les instructions SQL Data Manipulation Language (DML) suivantes sont ex\u00e9cut\u00e9es pour forcer le probl\u00e8me de qualit\u00e9 des donn\u00e9es :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f11f8ab elementor-widget elementor-widget-code-highlight\" data-id=\"f11f8ab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>UPDATE adventureworks_bronze.countryregion\r\n            SET CountryRegionCode = 'FR'\r\n          WHERE CountryRegionCode = 'FR_'; \r\n\r\n             -- Number of affected rows = 1\r\n\r\n         UPDATE adventureworks_bronze.creditcard\r\n            SET ExpMonth = null\r\n          WHERE ExpMonth = 1; ; \r\n\r\n             -- Number of affected rows = 1.613\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7aebd2e elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"7aebd2e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Le schedule des MLV s'ex\u00e9cute avec succ\u00e8s :<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11805\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/run4.png\" alt=\"\" width=\"605\" height=\"767\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/run4.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/run4-237x300.png 237w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p>La MLV creditcards n'\u00e9choue pas malgr\u00e9 la violation de la contrainte expirationmonth_chk dans cette MLV, car le param\u00e8tre ON MISMATCH de cette contrainte est r\u00e9gl\u00e9 sur DROP. Le seul endroit o\u00f9 vous pouvez voir les enregistrements supprim\u00e9s est la table sys_dq_metrics. Elle contient le nombre de violations \/ d'enregistrements supprim\u00e9s et le nombre d'enregistrements par contrainte en \u00e9chec pour le Sc\u00e9nario 4 :<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-11809\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/table4-1024x328.jpg\" alt=\"\" width=\"1024\" height=\"328\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/table4-1024x328.jpg 1024w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/table4-300x96.jpg 300w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/table4-768x246.jpg 768w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/table4.jpg 1056w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p><ul><li>Le nombre d'enregistrements dans la MLV creditcards de la couche Silver = 17 505 (soit 19 118 enregistrements dans la table source creditcard de la couche Bronze moins 1 613 cartes de cr\u00e9dit en \u00e9chec (en raison d'un Expiration Month manquant)).<\/li><li>La MLV orderheaders ne manque aucun enregistrement ; le code SQL de cette MLV contient un Left Outer Join vers la MLV creditcard, et aucune contrainte de qualit\u00e9 des donn\u00e9es li\u00e9e aux cartes de cr\u00e9dit n'a \u00e9t\u00e9 d\u00e9finie dans la MLV orderheaders ;<\/li><li>Contrairement aux contraintes avec un param\u00e8tre ON MISMATCH FAIL, les MLV avec un param\u00e8tre ON MISMATCH DROP ne prennent apparemment que peu ou pas de temps suppl\u00e9mentaire<\/li><\/ul><p><strong><br \/>MLV Data Quality Reports<\/strong><\/p><p>Sur le ruban de la page materialized lake views, un bouton <strong>Data quality report<\/strong>\u00a0est disponible.<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11813\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualrep.jpg\" alt=\"\" width=\"840\" height=\"282\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualrep.jpg 840w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualrep-300x101.jpg 300w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualrep-768x258.jpg 768w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/p><p>En appuyant sur ce bouton, un data quality report g\u00e9n\u00e9r\u00e9 automatiquement s'ouvre, contenant \u00e0 la fois une page de vue d'ensemble et une page de d\u00e9tail :<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-11814 size-full\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualityreport.png\" alt=\"\" width=\"605\" height=\"338\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualityreport.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualityreport-300x168.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11815\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualityrep2.png\" alt=\"\" width=\"605\" height=\"337\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualityrep2.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualityrep2-300x167.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p>Alors que la page de vue d'ensemble r\u00e9sume toutes les donn\u00e9es de toutes les MLV, la page de d\u00e9tail vous permet de vous concentrer sur une ou plusieurs MLV.<\/p><p>Remarque :<br \/><span style=\"font-style: inherit; font-weight: inherit;\">Ces rapports ne tiennent PAS compte des ex\u00e9cutions de MLV en \u00e9chec dues au param\u00e8tre ON MISMATCH r\u00e9gl\u00e9 sur FAIL sur une contrainte de MLV ; ils se concentrent uniquement sur les param\u00e8tres ON MISMATCH r\u00e9gl\u00e9s sur DROP. Cela signifie que ni les Data Quality Reports, ni la table sys_dq_metrics ne montreront l'impact des probl\u00e8mes de qualit\u00e9 des donn\u00e9es bloquants !!!<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-19f69aa elementor-widget elementor-widget-spacer\" data-id=\"19f69aa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aa35714 elementor-widget elementor-widget-heading\" data-id=\"aa35714\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">\u00c0 PROPOS DE L'AUTEUR<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8d15bb1 elementor-widget elementor-widget-author-box\" data-id=\"8d15bb1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"author-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-author-box\">\n\t\t\t\n\t\t\t<div class=\"elementor-author-box__text\">\n\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.linkedin.com\/in\/luc-busschots-abba344\/\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\t\t\t<h4 class=\"elementor-author-box__name\">\n\t\t\t\t\t\t\tLuc Busschots\t\t\t\t\t\t<\/h4>\n\t\t\t\t\t<\/a>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-author-box__bio\">\n\t\t\t\t\t\t<p>Senior BI Consultant<\/p>\n\t\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Data engineers spend too much time fixing pipelines.<br \/>\nWith MLVs in Microsoft Fabric, orchestration, lineage &#038; data quality come built-in.<\/p>","protected":false},"author":16,"featured_media":11828,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","footnotes":""},"categories":[5],"tags":[70],"class_list":["post-11759","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-articles","tag-fabric"],"acf":[],"uagb_featured_image_src":{"full":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines.png",2240,1260,false],"thumbnail":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines-150x150.png",150,150,true],"medium":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines-300x169.png",300,169,true],"medium_large":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines-768x432.png",768,432,true],"large":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines-1024x576.png",1024,576,true],"1536x1536":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines-1536x864.png",1536,864,true],"2048x2048":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines-2048x1152.png",2048,1152,true],"trp-custom-language-flag":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines.png",18,10,false]},"uagb_author_info":{"display_name":"Anneli Tomingas","author_link":"https:\/\/sparkle.consulting\/fr\/author\/anneli\/"},"uagb_comment_info":0,"uagb_excerpt":"Data engineers spend too much time fixing pipelines. With MLVs in Microsoft Fabric, orchestration, lineage & data quality come built-in.","_links":{"self":[{"href":"https:\/\/sparkle.consulting\/fr\/wp-json\/wp\/v2\/posts\/11759","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sparkle.consulting\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sparkle.consulting\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sparkle.consulting\/fr\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/sparkle.consulting\/fr\/wp-json\/wp\/v2\/comments?post=11759"}],"version-history":[{"count":74,"href":"https:\/\/sparkle.consulting\/fr\/wp-json\/wp\/v2\/posts\/11759\/revisions"}],"predecessor-version":[{"id":13670,"href":"https:\/\/sparkle.consulting\/fr\/wp-json\/wp\/v2\/posts\/11759\/revisions\/13670"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sparkle.consulting\/fr\/wp-json\/wp\/v2\/media\/11828"}],"wp:attachment":[{"href":"https:\/\/sparkle.consulting\/fr\/wp-json\/wp\/v2\/media?parent=11759"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sparkle.consulting\/fr\/wp-json\/wp\/v2\/categories?post=11759"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sparkle.consulting\/fr\/wp-json\/wp\/v2\/tags?post=11759"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}