Обновление наших рекомендаций по разрешениям: grants как конфигурации в dbt Core v1.2
Если вам нужно было предоставить доступ к модели dbt с 2019 года по сегодняшний день, есть большая вероятность, что вы наткнулись на пост "Точные операторы grant, которые мы используем в проекте dbt" на Discourse. В нем объяснялись варианты для покрытия двух дополнительных возможностей:
- запрос отношений через привилегию "select"
- использование схемы, в которой находятся эти отношения, через привилегию "usage"
Решение тогда
До dbt Core v1.2 мы предлагали три возможных подхода (каждый из которых имел предостережения и компромиссы):
- Использование хуков
on-run-end
дляgrant select on all
таблиц/представлений, которые только что построил dbt - Использование
post-hook
для предоставленияselect
на модели сразу после ее построения - Использование либо стандартных грантов (будущие гранты в Snowflake), либо комбинации
post-hooks
иon-run-end
хуков
Эти варианты были передовыми... до сегодняшнего дня!
Что изменилось?
В версии v1.2 мы представили конфигурацию grants
, которая работает очень похоже на post-hook
, с двумя ключевыми отличиями:
- Вы настраива ете
grants
как структурированный словарь, а не пишете весь SQL самостоятельно - dbt выберет наиболее эффективный путь для применения этих грантов
Почему grants
лучше, чем хуки
Во-первых, хуки сложны! Особенно эта путаница с вложенными фигурными скобками.
Проблема тогда
Предположим, вы работали над инкрементальной моделью. Ранее вы предоставили доступ к этой инкрементальной модели напрямую reporter
, чтобы люди могли запрашивать ее далее:
-- models/my_incremental_model.sql
{{ config(
materialized = 'incremental',
post_hook = ["grant select on {{ this }} to reporter"]
) }}
select ...
Со временем эта модель взяла на себя все больше и больше обязанностей, и вы решили переработать инкрементальную модель, чтобы она питала серию специализированных представлений. Заботливо, вы также удалили post_hook
, который предоставлял прямой доступ к инкрементальной модели:
-- models/my_incremental_model.sql
{{ config(materialized = 'incremental') }}
select ...
Проблема? Пока вы не выполните --full-refresh
, ваша инкрементальная модель все еще предоставлена роли reporter
!
Решение сегодня
Новая реализация grants
в dbt учитывает это. Она знает, переносятся ли гранты, когда модель запускается повторно, в зависимости от ее материализации и вашей базы данных. Она компенсирует разницу между существующими грантами и теми, которые вы действительно хотите.
Попробуйте!
-- models/my_incremental_model.sql
{{ config(
materialized = 'incremental',
grants = {'select': ['another_user']}
) }}
select ...
Запустите это, убедитесь, что another_user
может выбрать вашу модель. Затем измените вашу модель и запустите ее снова:
-- models/my_incremental_model.sql
{{ config(
materialized = 'incremental',
grants = {'select': []}
) }}
select ...
Если вы проверите свою базу данных, вы должны увидеть, что никто не может выбрать из инкрементальной модели. Вы также можете увидеть в журналах уровня отладки, что dbt выполнил оператор revoke
.
(Обратите внимание, что если grants
отсутствует или установлен в {}
, dbt поймет, что вы не хотите, чтобы он управлял грантами для этой таблицы. Поэ тому лучше явно указать привилегию и то, что вы хотите, чтобы никто ее не имел!)
Отлично! Теперь, когда вы используете функцию grants
в dbt v1.2, вы только что уделили этому больше внимания, чем когда-либо потребуется снова 😎
Есть ли еще место для хуков?
Да, конечно! Некоторые области, которые выделяются:
- Предоставление разрешений на другие типы объектов, такие как предоставление использования на схему
- Расширенные разрешения, такие как доступ на уровне строк