You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform配置Snowflake表权限报错:不支持schema_name动态块

解决Snowflake Table Grant Terraform配置错误:"Blocks of type 'schema_name' are not expected here"

错误原因

snowflake_table_grant资源不支持嵌套的schema_name或table_name动态块,这两个是资源的直接参数而非嵌套块结构。你原配置中错误地用dynamic块嵌套参数,不符合Terraform Snowflake Provider的资源定义规范。

解决方案

先将三层嵌套的var.select结构扁平化,生成每个数据库- Schema-表的独立条目,再为每个条目创建权限授予:

1. 扁平化变量结构(添加locals)

在配置中加入locals块,把原嵌套结构转换成扁平化列表,每个元素包含完整的数据库、Schema和表名:

locals {
  table_grants = flatten([
    for db_name, schemas in var.select : [
      for schema_name, tables in schemas : [
        for table_name in tables : {
          database_name = db_name
          schema_name   = schema_name
          table_name    = table_name
        }
      ]
    ]
  ])
}

2. 修改snowflake_table_grant资源配置

遍历扁平化后的local.table_grants,直接传入database_name、schema_name、table_name作为参数:

resource "snowflake_table_grant" "grant" {
  for_each = {
    for grant in local.table_grants : "${grant.database_name}.${grant.schema_name}.${grant.table_name}" => grant
  }

  database_name = each.value.database_name
  schema_name   = each.value.schema_name
  table_name    = each.value.table_name

  privilege         = "SELECT"
  roles             = ["role1"]
  shares            = ["share1"]
  on_future         = false
  with_grant_option = false
}

3. 保留原variable.tf配置

原变量定义无需修改,保持现有结构即可:

variable "select" {
  type    = map(map(list(string)))
  default = {
    database1 = {
      schema1 = ["table1", "table2"],
      schema2 = ["table3", "table4"],
    },
  }
}

说明

  • 扁平化后的local.table_grants会生成4个条目(对应示例中的4张表),每个条目对应一个独立的权限授予实例。
  • for_each使用database.schema.table作为唯一键,确保每个表的权限配置唯一且可追踪。

内容的提问来源于stack exchange,提问作者Kar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:22:48