Skip to content

Cum să folosești hook-uri în modele dbt

DodaTech Updated 2025-01-15 2 min read

In this tutorial, you'll learn about Cum să folosești hook. We cover key concepts, practical examples, and best practices.

Vei învăța cum să folosești hook-uri în dbt pentru a executa comenzi SQL înainte sau după crearea modelelor — granturi de permisiuni, crearea de indexuri și notificări.

Problema

După crearea unui model dbt, ai nevoie adesea de operații suplimentare — acordarea permisiunilor, crearea de indexuri, trimiterea de notificări. Hook-urile automatizează aceste sarcini.

Modul Greșit

-- model.sql — operații amestecate cu transformarea
CREATE TABLE IF NOT EXISTS user_summary AS SELECT ...;
GRANT SELECT ON user_summary TO analyst;
-- Amestecă logica de transformare cu administrarea
-- Dacă modelul eșuează, grantul tot se execută

Modul Corect

-- models/user_summary.sql — model curat, fără administrare
SELECT
    u.id,
    u.name,
    COUNT(o.id) AS order_count
FROM {{ ref('stg_users') }} u
LEFT JOIN {{ ref('stg_orders') }} o ON u.id = o.user_id
GROUP BY u.id, u.name
# dbt_project.yml — hook-uri la nivel de proiect
models:
  my_project:
    +pre-hook: "ALTER SESSION SET TIMEZONE = 'UTC'"
    +post-hook: "GRANT SELECT ON {{ this }} TO group analyst"
# models/schema.yml — hook-uri per model
models:
  - name: user_summary
    config:
      post-hook:
        - "GRANT SELECT ON {{ this }} TO analyst"
        - "COMMENT ON TABLE {{ this }} IS 'Rezumat lunar utilizatori'"
      pre-hook:
        - "CREATE INDEX IF NOT EXISTS idx_{{ this.name }}_id ON {{ this }}(id)"
dbt run --model user_summary

Output:

17:23:45  Pre-hook: ALTER SESSION SET TIMEZONE = 'UTC'
17:23:46  Running model user_summary
17:23:47  Post-hook: GRANT SELECT ON user_summary TO analyst
17:23:47  Post-hook: COMMENT ON TABLE user_summary IS 'Rezumat...'

Pas cu Pas

1. Adaugă hook-uri în dbt_project.yml

models:
  +post-hook: "GRANT SELECT ON {{ this }} TO GROUP readonly"

2. Adaugă hook-uri per model

models:
  - name: sensitive_model
    config:
      post-hook:
        - "REVOKE ALL ON {{ this }} FROM PUBLIC"
        - "GRANT SELECT ON {{ this }} TO admin"

3. Folosește hook-uri cu {{ this }}

{{ this }} se referă la tabelul/view-ul creat de modelul curent.

pre-hook: "DELETE FROM {{ this }} WHERE updated_at < NOW() - INTERVAL '30 days'"

Sfaturi de Prevenție

  • Folosește hook-uri pentru operații administrative, nu pentru transformări
  • Testează hook-urile într-un mediu de staging înainte de producție
  • Hook-urile eșuate opresc execuția modelului — asigură-te că sunt sigure
  • Folosește {{ this }} pentru a referi obiectul curent

Greșeli Comune

  1. Hook care eșuează și blochează modelul — un post-hook eșuat marchează modelul ca eșuat
  2. Hook executat pe obiectul greșit — uitarea lui {{ this }} duce la granturi pe tabele nepotrivite
  3. Hook-uri prea complexe — hook-urile ar trebui să fie simple; logica complexă merge în modele separate
  4. Hook duplicate — același hook definit și în YAML și în proiect se execută de două ori

Întrebări Frecvente

### Care e ordinea de execuție a hook-urilor?

Ordinea e: pre-hook global → pre-hook per model → model SQL → post-hook per model → post-hook global.

Pot avea hook-uri la nivel de seed sau snapshot?

Da — suportă aceleași opțiuni pre-hook și post-hook în configurare.

Cum accesez numele tabelului într-un hook?

Folosește {{ this }} pentru întregul nume (inclusiv baza și schema) sau {{ this.name }} doar pentru numele tabelului.

Construit de dezvoltătorii Doda Browser, DodaZIP și Durga Antivirus Pro. Instrumentele DodaTech se integrează perfect cu dbt pentru hook-uri sigure și eficiente.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro