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

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

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

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

您可以使用 BigQuery 表 ACL 来设置对逻辑视图和数据集级层授权视图的访问权限。逻辑视图还可以引用您使用 BigQuery 表 ACL 共享的其他源表和视图。

准备工作

  1. 创建您要用于 BigQuery 表 ACL 的视图

  2. 向将要执行本主题中的步骤的人员授予 BigQuery Data Owner (roles/bigquery.dataOwner) 角色或 BigQuery Admin (roles/bigquery.admin) 角色。

  3. 如需详细了解身份和访问权限管理 (IAM) 政策,请参阅了解政策政策参考主题。

创建访问权限政策

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

控制台

  1. 在 Cloud Console 中,打开 BigQuery 页面。

    转到 BigQuery

  2. 浏览器面板中,选择项目。

  3. 选择包含表或视图的数据集。

  4. 选择表或视图。

  5. 如果您要修改表的访问权限,请点击共享表。如果您要修改视图的访问权限,请点击共享视图

  6. 此时表权限视图权限页面会打开。对于添加成员,请输入将获得表或视图访问权限的用户的电子邮件地址。

  7. 选择角色下拉列表中,选择要向用户授予的角色。下图显示 joe@example.com 被授予 BigQuery Data Viewer (roles/bigquery.dataViewer) 角色。

    表权限

  8. 点击完成

SQL

使用以下 GRANT 语句向用户 joe@example.com 授予数据集中的表的 Data Viewer (roles/bigquery.dataViewer) 角色。

  GRANT `roles/bigquery.dataViewer`
  ON TABLE DATASET.TABLE_OR_VIEW
  TO "user:joe@example.com"
 

DATASET 替换为资源所属数据集的名称。

TABLE_OR_VIEW 替换为您要授予访问权限的表或视图。

如需详细了解 GRANT DCL 语句,请参阅标准 SQL 中的数据控制语言语句

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. 在 Cloud Console 中,打开 BigQuery 页面。

    转到 BigQuery

  2. 浏览器面板中,选择项目。

  3. 选择包含表或视图的数据集。

  4. 选择表或视图。

  5. 如果您要修改表的访问权限,请点击共享表。如果您要修改视图的访问权限,请点击共享视图

  6. 此时表权限视图权限页面会打开。

    • 如果要添加新成员,请使用创建访问权限政策中所示的相同技术。

    • 如果要移除用户的访问权限,请使用搜索成员字段搜索该用户。对于要移除用户的每个群组,请展开该群组,然后点击该用户对应的删除 按钮。

    • 如果您要更改用户的群组成员资格,请按上述 2 个步骤中的说明进行添加和/或删除操作。

  7. 根据需要,针对您要为其添加、修改或移除访问权限的其他用户重复上述步骤。完成后,点击完成

SQL

使用以下 REVOKE 语句移除用户 joe@example.com 在数据集中的表上的 Data Viewer (roles/bigquery.dataViewer) 角色。

  REVOKE `roles/bigquery.dataViewer`
  ON TABLE DATASET.TABLE_OR_VIEW
  FROM "user:joe@example.com"
 

DATASET 替换为资源所属数据集的名称。

TABLE_OR_VIEW 替换为要撤消其访问权限的表或视图。

如需详细了解 REVOKE DCL 语句,请参阅标准 SQL 中的数据控制语言语句

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 政策,请参阅了解政策以及政策参考主题。

后续步骤