使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

控制对表和视图的访问权限

本文档介绍如何使用表访问权限政策来控制对表和视图的访问权限。如需大致了解表访问权限政策,请参阅表访问权限政策简介

创建表或视图后,您可以通过以下方式设置其政策:

  • 使用 Google Cloud 控制台
  • 使用 bq set-iam-policy 命令
  • 调用 tables.setIamPolicy 方法
  • 使用 GRANTREVOKE 数据控制语言 (DCL) 语句

您可以使用表访问权限政策来设置对视图以及对数据集级层授权视图的访问权限。视图还可以引用您使用表访问权限政策共享的其他表和视图。

准备工作

您可以对 BigQuery 资源(如表和视图)使用表访问权限政策。如需详细了解如何创建表或视图,请参阅创建表创建视图

创建访问权限政策所需的权限

如需创建表访问权限政策,您需要具备 bigquery.tables.setIamPolicy Identity and Access Management (IAM) 权限。

以下每个预定义的 IAM 角色都包含针对表或视图创建访问权限政策所需的权限:

  • roles/bigquery.dataOwner
  • roles/bigquery.admin

如需详细了解 BigQuery 中的 IAM,请参阅 使用 IAM 进行访问权限控制

查询表和视图所需的权限

用户需要对其查询引用的所有表和视图拥有 bigquery.tables.getData 权限。此外,在查询视图时,用户需要对所有底层表和视图拥有此权限。但是,如果您使用的是授权视图授权数据集,则无需向用户授予对底层源数据的访问权限。

以下预定义的每个 IAM 角色均包含用户对查询引用的所有表和视图所需的权限:

  • roles/bigquery.admin
  • roles/bigquery.dataOwner
  • roles/bigquery.dataEditor
  • roles/bigquery.dataViewer

创建访问权限政策

如需在表或视图上创建访问权限政策,请执行以下操作:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器面板中,展开您的项目并选择数据集。

  3. 展开数据集并选择表或视图。

  4. 点击 分享

  5. 共享页面上,如需添加用户(或主帐号),请点击 添加主帐号

  6. 添加主帐号页面上,执行以下操作:

    • 对于新主帐号,输入用户。您可以添加单个用户、群组、服务帐号和工作区网域。
    • 选择角色下拉列表中,选择要向用户授予的角色。
    • 点击添加条件,以便为用户添加条件性访问权限。
  7. 点击保存以保存新用户的更改。

  8. 点击关闭以关闭共享页面。

SQL

如需向用户授予角色,请使用 GRANT DCL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    进入 BigQuery

  2. 在查询编辑器中,输入以下语句:

    GRANT `ROLE_LIST`
    ON TABLE DATASET.TABLE_OR_VIEW
    TO 'USER_LIST';
    

    替换以下内容:

    • ROLE_LIST:包含您要授予的权限的角色或以英文逗号分隔的角色列表,例如 roles/bigquery.dataViewer
    • DATASET:资源所在数据集的名称
    • TABLE_OR_VIEW:您要撤销其访问权限的表或视图
    • USER_LIST:向其授予角色的用户的英文逗号分隔列表,例如 user:joe@example.com

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

  1. 将现有政策检索到本地文件。

    bq get-iam-policy \
     project-id:dataset.table_or_view \
     > policy.json
    

    其中:

    • project-id 是项目 ID。
    • dataset 是包含要更新的资源(表或视图)的数据集的名称。
    • table_or_view 是要更新的资源的名称。

    识别表或视图以及将政策输出重定向到文件的更多示例:

    • bq get-iam-policy dataset1.table1 > policy.json
    • bq get-iam-policy --project_id=project1 -t dataset1.table1 > policy.json
    • bq get-iam-policy project1:dataset1.table1 > policy.json
  2. 如果您还没有向政策添加任何成员,则 policy.json 文件将包含一个 etag 值,没有其他字段。如需详细了解如何设置 policy.json 文件的格式,请参阅了解政策

  3. 如需添加第一个成员,请向政策添加 bindings 字段。例如,如需向 joe@example.com 授予 BigQuery Data Viewer (roles/bigquery.dataViewer) 角色,请运行以下命令:

    "bindings": [
     {
       "members": [
         "user:joe@example.com"
       ],
       "role": "roles/bigquery.dataViewer"
     }
    ]
    

    如果您需要向现有绑定添加更多成员,只需添加成员即可。此示例显示如何针对已存在的绑定向 jane@example.com 授予 BigQuery Data Viewer (roles/bigquery.dataViewer) 角色。

    "members": [
           "user:joe@example.com",
           "user:jane@example.com"
         ],
         "role": "roles/bigquery.dataViewer"
       }
    
  4. 更新政策。

    bq set-iam-policy \
     project-id:dataset.table_or_view \
     policy.json
    

    如需了解 IAM 政策架构版本,请参阅政策版本

API

  1. 调用 tables.getIamPolicy 以检索当前政策。

  2. 修改政策以添加成员和/或绑定。如需查看政策的格式,请参阅 bq 示例。

  3. 调用 tables.setIamPolicy 以写入新政策。

如需了解 IAM 政策架构版本,请参阅政策版本

Java

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

// Sample to create iam policy for table
public class CreateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    createIamPolicy(datasetName, tableName);
  }

  public static void createIamPolicy(String datasetName, String tableName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      policy
          .toBuilder()
          .addIdentity(Role.of("roles/bigquery.dataViewer"), Identity.allUsers())
          .build();
      bigquery.setIamPolicy(tableId, policy);
      System.out.println("Iam policy created successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not created. \n" + e.toString());
    }
  }
}

更新访问权限政策

如需更新表或视图的访问权限政策,请执行以下操作:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器面板中,展开您的项目并选择数据集。

  3. 展开数据集并选择表或视图。

  4. 点击 分享

  5. 共享页面上,执行以下操作:

    • 如需添加新用户,请按照创建访问政策中所述的步骤操作。

    • 要移除用户的访问权限,请使用搜索字段搜索该用户,或展开该用户所属的角色。对于要移除的用户,点击删除

    • 如需修改用户的访问权限,请点击修改

  6. 完成更改后,请点击保存

  7. 点击关闭以关闭共享页面。

SQL

如需从数据集的表或视图中移除用户的角色,请使用 REVOKE DCL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    进入 BigQuery

  2. 在查询编辑器中,输入以下语句:

    REVOKE `ROLE_LIST`
    ON TABLE DATASET.TABLE_OR_VIEW
    FROM 'USER_LIST';
    

    替换以下内容:

    • ROLE_LIST:包含您要授予的权限的角色或以英文逗号分隔的角色列表,例如 roles/bigquery.dataViewer
    • DATASET:资源所在数据集的名称
    • TABLE_OR_VIEW:您要撤销其访问权限的表或视图
    • USER_LIST:向其授予角色的用户的英文逗号分隔列表,例如 user:joe@example.com

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

  1. 将现有政策检索到本地文件。

    bq get-iam-policy --format=prettyjson \
     project-id:dataset.table_or_view \
     > policy.json
    

    其中:

    • project-id 是项目 ID。
    • dataset 是要更新的表所在的数据集的名称。
    • table_or_view 是要更新的表或视图的名称。

    识别表或视图以及将政策输出重定向到文件的更多示例:

    • bq get-iam-policy dataset1.table1 > policy.json
    • bq get-iam-policy --project_id=project1 -t dataset1.table1 > policy.json
    • bq get-iam-policy project1:dataset1.table1 > policy.json
  2. 根据需要修改 policy.json。

    如需详细了解如何设置 policy.json 文件的格式,请参阅了解政策

    如需了解 IAM 政策架构版本,请参阅政策版本

  3. 更新政策。

    bq set-iam-policy \
     project-id:dataset.table_or_view \
     policy.json
    

API

  1. 调用 tables.getIamPolicy 以检索当前政策。

  2. 修改政策以添加成员和/或绑定。

    如需了解政策所需的格式,请参阅政策参考主题。

  3. 调用 tables.setIamPolicy 以写入更新后的政策。

Java

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

// Sample to update iam policy in table
public class UpdateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    updateIamPolicy(datasetName, tableName);
  }

  public static void updateIamPolicy(String datasetName, String tableName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      Map<Role, Set<Identity>> binding = new HashMap<>(policy.getBindings());
      binding.remove(Role.of("roles/bigquery.dataViewer"));

      policy.toBuilder().setBindings(binding).build();
      bigquery.setIamPolicy(tableId, policy);

      System.out.println("Iam policy updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not updated. \n" + e.toString());
    }
  }
}

如需详细了解 Identity and Access Management 政策,请参阅了解政策以及政策参考主题。

后续步骤