#jinja2 #snowflake-cloud-data-platform #dbt
Вопрос:
Выполнение варианта этого примера для макроса ( grant_select_on_schemas.sql
) для установки грантов для экземпляра snowflake после запуска dbt. Моя проблема в том, что я унаследовал нестандартную конфигурацию сборки dbt, которая включает в себя некоторые статически определенные местоположения нецелевых моделей.
Примеры:
snowflake-instance
|
|> raw_db
|> elt_schema_1
|> elt_schema_2
|> elt_schema_3
|> utils_db
|> calendar_schema_1
|> staging_db
|> elt_staging_1
|> elt_staging_2
|> elt_staging_3
|> analytics_db
|> core_models
|> mart_1
|> mart_2
profiles.yml
target: prod
outputs:
prod:
type: snowflake
account: my-account.region-1
role: my-role
# User/password auth
user: <user>
password: <pass>
database: raw_db
warehouse: my-warehouse
schema: PUBLIC
threads: 2
client_session_keep_alive: False
query_tag: my-dbt-local
dbt-project.yml
models:
my-pro:
materialized: table
utils:
database: UTILS
materialized: table
calendar:
schema: calendar_schema_1
staging:
database: staging_db
materialized: view
elt_staging_1:
schema: elt_staging_1
elt_staging_2:
schema: elt_staging_2
elt_staging_3:
schema: elt_staging_3
grant_select_on_schemas.sql
-- macros/grants/grant_select_on_schemas.sql
{% macro grant_select_on_schemas(schemas, role) %}
{% for schema in schemas %}
{% for role in roles %}
grant usage on schema {{ schema }} to role {{ role }};
grant select on all tables in schema {{ schema }} to role {{ role }};
grant select on all views in schema {{ schema }} to role {{ role }};
grant select on future tables in schema {{ schema }} to role {{ role }};
grant select on future views in schema {{ schema }} to role {{ role }};
{% endfor %}
{% endfor %}
{% endmacro %}
В настоящее время я сталкиваюсь с проблемой с этим макросом, на котором макрос пытается работать со всеми схемами в моем профиле {{ target.database }}
(который в настоящее время установлен на staging_db
), и, как следствие, выдает ошибки при попытке таких вещей, как:
> Database Error
> 002003 (02000): SQL compilation error:
> Schema 'staging_db.core_models' does not exist or not authorized.
Что я упускаю?
Ответ №1:
Я присоединился к stackoverflow только для того, чтобы ответить на ваш вопрос, потому что у меня был такой же 6-8 месяцев назад (я даже дважды проверил, что это не я задавал вопрос, потому что это было бы неловко).
Проверьте database_schemas
переменную, которая находится в недрах документации dbt:
https://docs.getdbt.com/reference/dbt-jinja-functions/on-run-end-context#database_schemas
Вы должны иметь возможность добавить его как таковой:
{% macro grant_select_on_schemas(database_schemas, role) %}
{% for (database,schema) in database_schemas %}
{% for role in roles %}
grant usage on schema {{ database }}.{{ schema }} to role {{ role }};
grant select on all tables in schema {{ database }}.{{ schema }} to role {{ role }};
grant select on all views in schema {{ database }}.{{ schema }} to role {{ role }};
grant select on future tables in schema {{ database }}.{{ schema }} to role {{ role }};
grant select on future views in schema {{ database }}.{{ schema }} to role {{ role }};
{% endfor %}
{% endfor %}
{% endmacro %}