为什么在尝试表实现时,dbt 中会出现“选择活动仓库”错误,而视图实现时却不会出现该错误?

stu*_*ins 10 snowflake-cloud-data-platform dbt

我已经使用 dbt 几个月了,所以对它还很陌生。运行测试模型时,使用视图物化没有任何问题:

{{ config(materialized='view') }}

select 1 as id
Run Code Online (Sandbox Code Playgroud)

导致:

15:30:25 | 1 of 1 START view model dbt.stg_CampaignTableTest.................... [RUN]
15:30:26 | 1 of 1 OK created view model dbt.stg_CampaignTableTest............... [SUCCESS 1 in 1.48s]
Run Code Online (Sandbox Code Playgroud)

但是,当我切换到表实现时,我收到一条错误消息,表明未在 Snowflake 中选择活动仓库:

{{ config(materialized='table') }}

select 1 as id
Run Code Online (Sandbox Code Playgroud)

导致:

15:32:52 | 1 of 1 START table model dbt.stg_CampaignTableTest................... [RUN]
15:32:53 | 1 of 1 ERROR creating table model dbt.stg_CampaignTableTest.......... [ERROR in 1.22s]

Database Error in model stg_CampaignTableTest (models/test/stg_CampaignTableTest.sql)
  000606 (57P03): No active warehouse selected in the current session.  Select an active warehouse with the 'use warehouse' command.
Run Code Online (Sandbox Code Playgroud)

当然,不可能在我的测试模型中包含“使用仓库”语句,因为它被插入到编译后的 SQL 中的错误位置:

{{ config(materialized='table') }}

use warehouse "AnalysisTeam_WH";

select 1 as id
Run Code Online (Sandbox Code Playgroud)

因为它会导致:

2021-10-07T15:33:59.366279Z: On model.my_new_project.stg_CampaignTableTest: /* {"app": "dbt", "dbt_version": "0.21.0", "profile_name": "user", "target_name": "default", "node_id": "model.my_new_project.stg_CampaignTableTest"} */


      create or replace transient table "AnalysisTeam"."dbt"."stg_CampaignTableTest"  as
      (

use warehouse "AnalysisTeam_WH";
2021-10-07T15:33:59.366342Z: Opening a new connection, currently in state closed
2021-10-07T15:34:00.163673Z: Snowflake query id: 019f7386-3200-ec67-0000-464100e189fa
2021-10-07T15:34:00.163803Z: Snowflake error: 001003 (42000): SQL compilation error:
syntax error line 4 at position 0 unexpected 'use'.
Run Code Online (Sandbox Code Playgroud)

我的 Snowflake“角色”似乎拥有创建表、视图等的正确权限,因此我不明白为什么从视图更改为表会导致模型失败。我怀疑这可能与 Snowflake 权限有关,而不是 dbt 问题,但我不确定。任何想法将非常感激!

编辑:我的屏幕截图似乎犯了一个错误,因此我已切换到希望更清晰的代码片段。

Luk*_*zda 7

我建议检查两种可能性。

A. “~/.dbt/profiles.yml”处的活动配置文件配置Snowflake 配置文件

并搜索“仓库:”

my-snowflake-db:
  target: dev
  outputs:
    dev:
      type: snowflake
      account: [account id]

      # User/password auth
      user: [username]
      password: [password]

      role: [user role]
      database: [database name]
      warehouse: [warehouse name]    <<<<<
      schema: [dbt schema]
      threads: [1 or more]
Run Code Online (Sandbox Code Playgroud)

B. 用于连接ALTER USER的用户的默认仓库设置:

SHOW USERS;

ALTER USER user_name SET DEFAULT_WAREHOUSE = '<existing_warehouse_name>';
Run Code Online (Sandbox Code Playgroud)

  • 嗨卢卡斯,非常感谢您的这些提示。我进入了 dbt Cloud 的“个人资料”页面,因为这就是我目前正在使用的,以便仔细检查设置。我填充了仓库名称,但尝试将其放在引号中,这似乎解决了问题。我仍在了解有关 Snowflake 需要引用某些值的很多信息!我认为我没有足够的声誉来将您的帖子标记为答案,但只是表示非常感谢。 (2认同)