dbt : schemas dynamiques par tenant

🎯 Objectif

Tu veux un seul projet dbt, mais que :

  • chaque client (tenant) ait ses propres tables dans un schema dĂ©diĂ© (leclerc., carrefour., etc.),
  • le mĂȘme modĂšle dbt (fact_ventes.sql) soit exĂ©cutĂ© pour chaque tenant sans dupliquer le code.

✅ Solution : schemas dynamiques par tenant

dbt permet d’utiliser des schemas dynamiques Ă  l’aide de la mĂ©thode generate_schema_name.


đŸ§± 1. DĂ©finir les tenants dans dbt_project.yml

vars:
  tenants: ["leclerc", "carrefour", "intermarche"]

🧠 2. Surcharge du comportement de dbt dans dbt_project.yml

Ajoute ceci pour personnaliser les noms de schemas générés :

models:
  mon_projet:
    +schema: "{{ target.schema }}_{{ var('current_tenant', 'default') }}"

Ex : si target.schema = "analytics" et current_tenant = "leclerc" ⇒ les modĂšles seront dans le schĂ©ma analytics_leclerc


⚙ 3. Surcharge generate_schema_name (optionnel mais plus propre)

Dans macros/generate_schema_name.sql :

{% macro generate_schema_name(custom_schema_name, node) %}
    {{ target.schema }}_{{ var('current_tenant', 'default') }}
{% endmacro %}

📄 4. Exemple de modĂšle unique exĂ©cutĂ© pour tous les tenants

-- models/fact_ventes.sql

select
    id_vente,
    produit,
    quantite,
    prix
from {{ ref('stg_ventes') }}

🔁 5. ExĂ©cution multi-tenant avec script bash

for tenant in leclerc carrefour intermarche
do
  dbt run --vars "{current_tenant: '$tenant'}"
done

✅ Cela exĂ©cute le mĂȘme code, mais chaque fois avec un schĂ©ma diffĂ©rent (analytics_leclerc, analytics_carrefour…)


🔎 6. Organisation des schĂ©mas dans ton entrepĂŽt

Tu obtiendras dans BigQuery ou Snowflake ou Redshift :

analytics_leclerc.fact_ventes
analytics_carrefour.fact_ventes
analytics_intermarche.fact_ventes

👉 Ce qui t’apporte :

  • isolation des donnĂ©es (chaque client a son propre espace)
  • code unique (pas besoin de copier-coller fact_ventes_leclerc.sql, fact_ventes_carrefour.sql…)

✅ Avantages

AvantageDétail
🔁 RĂ©utilisation du codeUn seul modĂšle fact_ventes.sql pour tous
📁 Organisation claireChaque tenant a son propre schĂ©ma (analytics_leclerc)
đŸ›Ąïž SĂ©curitĂ© / isolationLes donnĂ©es ne se mĂ©langent pas (utile pour les ACLs ou droits d’accĂšs)
📩 Compatible avec ref()Pas besoin de manipuler manuellement les noms de tables
đŸ§Œ Maintenance simplifiĂ©eTu ajoutes un tenant, tu l’exĂ©cutes avec --vars et c’est bon

Leave a Reply

Your email address will not be published. Required fields are marked *