🔖

【dbt Docs】Building a dbt Project - Hooks & Operations

2022/03/15に公開

Hooks & Operations

https://docs.getdbt.com/docs/building-a-dbt-project/hooks-operations

Assumed knowledge

Getting started

効果的なデータベース管理では、次のように追加のSQLステートメントを実行する必要がある場合があります。

  • テーブル/ビューに対する特権の付与
  • UDFの作成
  • RedshiftでテーブルをVacuum
  • Redshift Spectrum外部テーブルでのパーティションの作成
  • SnowflakeのWarehouseの再開/一時停止/サイズの変更
  • SnowflakeでPipeを更新する
  • SnowflakeでShareを作成する
  • Snowflakeでデータベースのクローンを作成する

dbtは、バージョン管理を行い、dbtプロジェクトの一部としてこれらのステートメントを実行するための2つの異なるインターフェース(フックと操作)を提供します。

Hooks

フックは、さまざまな時間に実行されるSQLのスニペットです。

  • pre-hook:モデル、シード、またはスナップショットが作成される前に実行されます。
  • post-hook:モデル、シード、またはスナップショットが構築された後に実行されます。
  • on-run-start:開始時に実行 dbt rundbt seedまたはdbt snapshot
  • on-run-end:最後に実行 dbt rundbt seed または dbt snapshot

フックは、dbt_project.ymlファイルで定義されています。pre-hookpost-hookconfigブロックで定義できる。

dbt_project.yml
on-run-end:
  - "grant usage on {{ target.schema }} to role reporter"

models:
  +post-hook:
    - "grant select on {{ this }} to role reporter"
models/<model_name>.sql
{{ config(
    post_hook=[
      "grant select on {{ this }} to role reporter"
    ]
) }}

select ...

Operations

操作は、コマンドコマンドを使用して実行できるマクロです。そのため、操作は実際にはdbtプロジェクト内の個別のリソースではありません。これらは、モデルを実行せずにマクロを呼び出すための便利な方法にすぎません。run-operation

macros/grant_select.sql
{% macro grant_select(role) %}
{% set sql %}
    grant usage on schema {{ target.schema }} to role {{ role }};
    grant select on all tables in schema {{ target.schema }} to role {{ role }};
    grant select on all views in schema {{ target.schema }} to role {{ role }};
{% endset %}

{% do run_query(sql) %}
{% do log("Privileges granted", info=True) %}
{% endmacro %}

このマクロを操作として呼び出すには、を実行しdbt run-operation grant_select --args '{role: reporter}'ます。

$ dbt run-operation grant_select --args '{role: reporter}'
Running with dbt=0.16.1
Privileges granted

Additional examples

Discussion