Хуки и операции
Связанная документация
Предполагаемые знания
Начало работы с хуками и операциями
Эффективное администрирование баз данных иногда требует выполнения дополнительных SQL-запросов, например:
- Создание UDF
- Управление разрешениями на уровне строк или столбцов
- Очистка таблиц в Redshift
- Создание разделов в внешних таблицах Redshift Spectrum
- Возобновление/приостановка/изменение размера складов в Snowflake
- Обновление pipe в Snowflake
- Создание общего доступа в Snowflake
- Клонирование базы данных в Snowflake
dbt предоставляет хуки и операции, чтобы вы могли контролировать версии и выполнять эти запросы как часть вашего проекта dbt.
О хуках
Хуки — это фрагменты SQL, которые выполняются в разное время:
pre-hook
: выполняется перед построением модели, seed или snapshot.post-hook
: выполняется после построения модели, seed или snapshot.on-run-start
: выполняется в началеdbt build
,dbt compile
,dbt docs generate
,dbt run
,dbt seed
,dbt snapshot
илиdbt test
.on-run-end
: выполняется в концеdbt build
,dbt compile
,dbt docs generate
,dbt run
,dbt seed
,dbt snapshot
илиdbt test
.
Хуки — это более продвинутая возможность, которая позволяет вам выполнять пользовательский SQL и использовать специфические для базы данных действия, выходящие за рамки того, что dbt предоставляет из коробки с помощью стандартных материализаций и конфигураций.
Если (и только если) вы не можете использовать grants
resource-config, вы можете использовать post-hook
для выполнения более сложных рабочих процессов:
- Необходимо применить
grants
более сложным способом, который конфигурацияgrants
в dbt Core пока не поддерживает. - Необходимо выполнить пост-обработку, которую dbt не поддерживает из коробки. Например,
analyze table
,alter table set property
,alter table ... add row access policy
и т.д.
Примеры использования хуков
Вы можете использовать хуки для запуска действий в определенные моменты при выполнении операции или построении модели, seed или snapshot.
Для получения дополнительной информации о том, когда могут быть вызваны хуки, см. разделы справки для on-run-start
и on-run-end
хуков и pre-hook
и post-hook
.
Вы можете использовать хуки для предоставления специфичной для базы данных функциональности, недоступной из коробки в dbt. Например, вы можете использовать блок config
для выполнения оператора ALTER TABLE
сразу после построения отдельной модели с помощью post-hook
:
{{ config(
post_hook=[
"alter table {{ this }} ..."
]
) }}
Вызов макроса в хуке
Вы также можете использовать макрос для объединения логики хука. Ознакомьтесь с некоторыми примерами в разделах справки для on-run-start и on-run-end хуков и pre- и post-хуков.
{{ config(
pre_hook=[
"{{ some_macro() }}"
]
) }}
models:
- name: <model_name>
config:
pre_hook:
- "{{ some_macro() }}"
models:
<project_name>:
+pre-hook:
- "{{ some_macro() }}"
Операции
Операции — это макросы, которые вы можете выполнять с помощью команды run-operation
. Таким образом, операции на самом деле не являются отдельным ресурсом в вашем проекте dbt — это просто удобный способ вызвать макрос без необходимости выполнения модели.
В отличие от хуков, вам нужно явно выполнить запрос внутри макроса, используя либо statement block, либо вспомогательный макрос, такой как макрос run_query. В противном случае dbt вернет запрос в виде строки без его выполнения.
Этот макрос выполняет аналогичное действие, как и вышеупомянутые хуки:
{% 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
Полная документация по использованию команды run-operation
доступна здесь.
Дополнительные примеры
Эти примеры из сообщества подчеркивают некоторые случаи использования хуков и операций!
- Подробное обсуждение предоставления привилегий с использованием хуков и операций для версий dbt Core до 1.2
- Стадирование внешних таблиц
- Выполнение клонирования без копирования в Snowflake для сброса среды разработки
- Выполнение
vacuum
иanalyze
на складе Redshift - Создание общего доступа в Snowflake
- Выгрузка файлов в S3 на Redshift
- Создание событий аудита для времени выполнения модели
- Создание UDF