đŻ 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"
etcurrent_tenant = "leclerc"
â les modĂšles seront dans le schĂ©maanalytics_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
Avantage | Détail |
---|---|
đ RĂ©utilisation du code | Un seul modĂšle fact_ventes.sql pour tous |
đ Organisation claire | Chaque tenant a son propre schĂ©ma (analytics_leclerc ) |
đĄïž SĂ©curitĂ© / isolation | Les 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Ă©e | Tu ajoutes un tenant, tu lâexĂ©cutes avec --vars et câest bon |