dbt: hook

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

TypeQuand s’exécute-t-il ?Exemple
pre-hookAvant l’exécution d’un modèle/test/seedPurger une table de staging
post-hookAprès la création ou l’exécution du modèleFaire 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 dbtHooks autorisés
Modèles (.sql)pre-hook, post-hook
Seedspre-hook, post-hook
Testspre-hook, post-hook
Snapshotspre-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

AvantageDétail
🔁 AutomatisationPlus besoin d’écrire des scripts manuels externes
🔐 SécuritéTu peux gérer les permissions directement dans le projet
🧠 MaintenanceCentralisé et versionné dans le repo Git
⚙️ FlexibleCompatible avec la logique Jinja (conditions, variables)

⚠️ Limites

LimiteDé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émentRôle
pre-hookExécuté avant le modèle
post-hookExécuté après le modèle
{{ this }}Représente la table ou vue créée
target.namePermet de cibler un environnement (dev, prod)
UtilisationSécurité, logs, nettoyage, contrôle SQL

Leave a Reply

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