Les hooks en dbt sont des commandes SQL que tu peux faire exécuter automatiquement avant ou après certaines étapes du pipeline, comme la création d’un modèle, l’exécution d’un test, ou un run-operation
.
🧠 C’est quoi un hook dans dbt ?
Un hook est un bloc de SQL qui s’exécute avant (
pre-hook
) ou après (post-hook
) un modèle, une source, une seed, etc.
Ils sont utilisés pour :
- appliquer des GRANTs
- tracer des logs techniques
- nettoyer ou créer des tables temporaires
- enregistrer des métriques
- activer des options du data warehouse (ex :
SET ROLE
,SET SESSION
, etc.)
🔄 Deux types de hooks
Type | Quand s’exécute-t-il ? | Exemple |
---|---|---|
pre-hook | Avant l’exécution d’un modèle/test/seed | Purger une table de staging |
post-hook | Après la création ou l’exécution du modèle | Faire un GRANT SELECT |
📌 Exemple 1 : post-hook
global dans dbt_project.yml
models:
my_project:
+post-hook:
- "GRANT SELECT ON {{ this }} TO groupe_bi"
✅ Chaque modèle de my_project
exécutera un GRANT
après sa création.
📌 Exemple 2 : pre-hook
sur un modèle spécifique
-- models/clean_data.sql
{{ config(
pre_hook=["DELETE FROM logs.temp_debug"],
materialized="table"
) }}
SELECT * FROM source_data
✅ Avant de créer la table clean_data
, dbt supprime une table temporaire.
📌 Exemple 3 : hooks conditionnels par environnement
+post-hook:
- "{% if target.name == 'prod' %} GRANT SELECT ON {{ this }} TO bi_users {% endif %}"
✅ Tu sécurises tes environnements : pas de GRANT
en dev
.
🧱 Où peut-on mettre des hooks ?
Objet dbt | Hooks autorisés |
---|---|
Modèles (.sql ) | ✅ pre-hook , post-hook |
Seeds | ✅ pre-hook , post-hook |
Tests | ✅ pre-hook , post-hook |
Snapshots | ✅ pre-hook , post-hook |
dbt_project.yml | ✅ (au niveau des modèles) |
Macros | ❌ pas directement |
⚙️ Utilisation avancée
- Tu peux enregistrer un log dans une table d’audit à chaque exécution :
+post-hook:
- >
INSERT INTO logs.model_executions(model_name, executed_at)
VALUES ('{{ this }}', CURRENT_TIMESTAMP)
- Tu peux même chaîner plusieurs hooks :
+post-hook:
- "ANALYZE TABLE {{ this }}"
- "GRANT SELECT ON {{ this }} TO role_bi"
✅ Avantages
Avantage | Détail |
---|---|
🔁 Automatisation | Plus besoin d’écrire des scripts manuels externes |
🔐 Sécurité | Tu peux gérer les permissions directement dans le projet |
🧠 Maintenance | Centralisé et versionné dans le repo Git |
⚙️ Flexible | Compatible avec la logique Jinja (conditions, variables) |
⚠️ Limites
Limite | Détail |
---|---|
Pas de rollback automatique en cas d’échec | |
Les erreurs dans les hooks stoppent le modèle | |
Peut nuire aux performances si mal utilisés (ex. : GRANT à chaque run) |
🧠 Résumé
Élément | Rôle |
---|---|
pre-hook | Exécuté avant le modèle |
post-hook | Exécuté après le modèle |
{{ this }} | Représente la table ou vue créée |
target.name | Permet de cibler un environnement (dev , prod ) |
Utilisation | Sécurité, logs, nettoyage, contrôle SQL |