dbt: Stratégie propre et automatisée pour gérer les droits d’accès (GRANTs) dans un projet dbt

Cet article décrit une stratégie propre et automatisée pour gérer les droits d’accès (GRANTs) dans un projet dbt, selon l’environnement (dev, prod, etc.), en utilisant les post-hook de dbt.


🧠 Problème métier

Tu as plusieurs environnements dbt :

  • dev → accessible à toi seul
  • prod → accessible à toute l’équipe Data Science ou BI

Mais tu ne veux pas donner les mêmes droits (GRANT) sur les tables dbt dans chaque environnement.

Ex. : en prod, tu dois faire :

GRANT SELECT ON TABLE analytics.mart_ventes TO groupe_bi;

Tu veux que ça se fasse automatiquement et seulement en prod, après que dbt a créé la table.


✅ Solution : utiliser les post-hook conditionnels dans dbt_project.yml

📌 post-hook = commande SQL exécutée après la création du modèle

Tu peux ajouter un hook global comme ceci :

models:
  my_project:
    +post-hook:
      - "{% if target.name == 'prod' %} GRANT SELECT ON {{ this }} TO groupe_bi {% endif %}"
  • {{ this }} est une variable dbt qui contient le nom complet de l’objet (schema.nom_table)
  • target.name contient le nom de l’environnement (dev, prod, etc.)
  • Le if Jinja te permet de n’exécuter le GRANT que dans l’environnement cible

🧱 Exemple complet

# dbt_project.yml

models:
  my_project:
    marts:
      +post-hook:
        - "{% if target.name == 'prod' %} GRANT SELECT ON {{ this }} TO groupe_bi {% endif %}"

Ce que ça fait :

EnvironnementComportement
devle hook ne s’exécute pas (if est faux)
prodle hook exécute un GRANT sur la table créée

✅ Résultat :

  • Pas besoin d’écrire manuellement les GRANT
  • Pas de GRANT dangereux dans dev
  • Tu peux versionner ça dans Git, comme le reste du projet

⚙️ Bonus : ciblage par modèle

Tu peux aussi définir le post-hook au niveau d’un seul modèle :

-- models/marts/mart_ventes.sql

{{ config(
  post_hook=[
    "{% if target.name == 'prod' %} GRANT SELECT ON {{ this }} TO groupe_bi {% endif %}"
  ]
) }}

SELECT ...

✅ Avantages

AvantageDétail
🔐 SécuritéTu limites les droits sensibles à prod
🔁 AutomatiséPas besoin d’un script GRANT manuel
🧩 VersionnéLes règles d’accès vivent dans le repo Git
🧠 Centralisé ou granulaireTu peux appliquer le hook globalement ou modèle par modèle

⚠️ Limites

Point d’attentionDétail
Pas de rollback automatique en cas d’erreur dans le GRANT
Ne couvre que les GRANT sur les objets créés par dbt (pas les sources)
Le groupe (groupe_bi) doit déjà exister dans le warehouse

🧠 Résumé

ÉlémentRôle
post-hook:Exécuter du SQL après la création du modèle
{{ this }}Référence à la table ou vue générée
{% if target.name == 'prod' %}Condition pour exécuter le GRANT seulement en prod
UsageAutomatiser les droits d’accès, éviter les oublis

Souhaites-tu un modèle prêt à copier avec des post-hook différents pour prod et staging, avec des rôles personnalisés ?

Leave a Reply

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