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 seulprod
→ 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 :
Environnement | Comportement |
---|---|
dev | le hook ne s’exécute pas (if est faux) |
prod | le hook exécute un GRANT sur la table créée |
✅ Résultat :
- Pas besoin d’écrire manuellement les
GRANT
- Pas de
GRANT
dangereux dansdev
- 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
Avantage | Dé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 granulaire | Tu peux appliquer le hook globalement ou modèle par modèle |
⚠️ Limites
Point d’attention | Dé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ément | Rô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 |
Usage | Automatiser 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 ?