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
相关产品推荐
相关产品推荐

