Существует ли список переменных всех *допустимых* комбинаций баз данных и схем в dbt jinja?

#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 %}