代码之家  ›  专栏  ›  技术社区  ›  Kar

Terraform:SSnowflake:动态模式//表/数据库

  •  0
  • Kar  · 技术社区  · 1 年前

    要求:需要在变量中赋值。选择数据库名称、方案名称和表名称

    我想将每个表名称授予共享名称

    问题

    │   19:   dynamic "schema_name" {
    │
    │ Blocks of type "schema_name" are not expected here.
    

    密码 以下是我写的内容,但无法解决问题

    resource "snowflake_table_grant" "grant" {
      for_each = var.select
    
      database_name = each.key
    
      dynamic "schema_name" {
        for_each = each.value
        content {
          schema_name = schema_name.key
    
          dynamic "table_name" {
            for_each = schema_name.value
            content {
              table_name = table_name.value
    
              privilege         = "SELECT"
              roles             = ["role1"]
              shares            = ["share1"]
              on_future         = false
              with_grant_option = false
            }
          }
        }
      }
    }
    

    可变.tf

    variable "select" {
      type    = map(map(list(string)))
      default = {
        database1 = {
          schema1 = ["table1", "table2"],
          schema2 = ["table3", "table4"],
        },
      }
    }
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   Marcin    1 年前

    你必须 压平 您的变量:

    
    locals {
    
      select_flat = merge(flatten([
        for database_name, schemas in var.select: [
          for schema_name, tables in schemas: {
              for table_name in tables: 
                "${database_name}-${schema_name}-${table_name}" => {
                     "database_name" = database_name
                     "schema_name" = schema_name
                     "table_name" = table_name
                 }                 
          }
        ] 
      ])...) # do NOT remove the dots
    }
    

    然后

    resource "snowflake_table_grant" "grant" {
        for_each      = local.select_flat
    
        database_name = each.value.database_name
        schema_name   = each.value.database_name
        table_name    = each.value.table_name  
    
        privilege         = "SELECT"
        roles             = ["role1"]
        shares            = ["share1"]
        on_future         = false
        with_grant_option = false
    }