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

如何用Terraform snowflake_grant_privileges_to_role给指定表列表授权给Share

问题描述

需要将指定表列表的权限授予指定Share。原先使用的snowflake_table_grant资源已弃用,现在要改用官方提供的snowflake_grant_privileges_to_role相关资源,但官方文档里没有找到针对指定表列表(而非全表)授予Share权限的完整示例。

弃用的旧实现(OLD_WAY)

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             = [snowflake_role.role.name]
    shares            = [snowflake_share.share.name]

    on_future         = true
    with_grant_option = false
}

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
             }                 
      }
    ] 
  ])...)
}

官方提供的新语法示例(NEW_WAY)

resource "snowflake_grant_privileges_to_role" "g12" {
  privileges = ["SELECT"]
  role_name  = snowflake_role.r.name
  on_schema_object {
    all {
      object_type_plural = "TABLES"
      in_schema          = "\"my_db\".\"my_schema\""
    }
  }
}

解决方案

要给指定表列表授予Share权限,可结合for_each遍历目标表列表,为每个表单独配置授权资源,直接关联目标Share即可。具体实现如下:

1. 保留扁平化表列表逻辑(复用旧代码的local配置)

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
             }                 
      }
    ] 
  ])...)
}

2. 用新资源实现指定表的Share授权

resource "snowflake_grant_privileges_to_share" "table_select_grant" {
  for_each = local.select_flat

  privileges = ["SELECT"]
  share_name = snowflake_share.share.name

  on_schema_object {
    object_type = "TABLE"
    fully_qualified_name = "\"${each.value.database_name}\".\"${each.value.schema_name}\".\"${each.value.table_name}\""
  }
}

说明:

  • 使用snowflake_grant_privileges_to_share直接给Share授权,无需通过中间角色,更贴合需求场景
  • 借助for_each遍历扁平化后的表列表,为每个表创建独立的授权实例
  • 通过fully_qualified_name指定单个表的完整标识符,实现精准授权

如果需要同时给角色和Share授权,可以分别配置两个资源:

# 给角色授权指定表
resource "snowflake_grant_privileges_to_role" "table_select_to_role" {
  for_each = local.select_flat

  privileges = ["SELECT"]
  role_name  = snowflake_role.role.name

  on_schema_object {
    object_type = "TABLE"
    fully_qualified_name = "\"${each.value.database_name}\".\"${each.value.schema_name}\".\"${each.value.table_name}\""
  }
}

# 给Share授权指定表
resource "snowflake_grant_privileges_to_share" "table_select_to_share" {
  for_each = local.select_flat

  privileges = ["SELECT"]
  share_name = snowflake_share.share.name

  on_schema_object {
    object_type = "TABLE"
    fully_qualified_name = "\"${each.value.database_name}\".\"${each.value.schema_name}\".\"${each.value.table_name}\""
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:22:49