创建和管理授权视图

本文档介绍如何使用 Google Cloud CLI 在已获授权的视图上定义和创建视图以及执行其他管理操作。在阅读本文档之前,您应先熟悉授权视图概览

所需的角色

如需获取对授权视图执行管理操作所需的权限,请让管理员向您授予底层表的 Bigtable Admin (roles/bigtable.admin) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

此预定义角色包含对授权视图执行管理操作所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需对授权视图执行管理操作,您需要拥有以下权限:

  • bigtable.authorizedViews.get
  • bigtable.authorizedViews.list
  • bigtable.authorizedViews.create
  • bigtable.authorizedViews.update
  • bigtable.authorizedViews.delete
  • bigtable.authorizedViews.getIamPolicy
  • bigtable.authorizedViews.setIamPolicy
  • bigtable.authorizedViews.readRows
  • bigtable.authorizedViews.sampleRowKeys
  • bigtable.authorizedViews.mutateRows

您也可以使用自定义角色或其他预定义角色来获取这些权限。

如需了解如何在已获授权的视图级别管理 Bigtable IAM 角色,请参阅已获授权的视图级 IAM 管理

创建授权视图

创建已获授权的视图时,请考虑将对其运行的查询。发送到授权视图的读取、写入和删除请求必须仅引用该授权视图中的数据。例如,如果您尝试读取、写入或删除表中的列不在授权视图中的行,则请求将失败。

为避免因向表中添加不在授权视图中的列而导致对授权视图的数据请求失败的情况,您可以为列族指定空的列限定符前缀 ""。

您可以为每个授权视图指定最多 100 个定义参数。

gcloud

运行 bigtable authorized-views create 命令。

gcloud bigtable authorized-views create AUTHORIZED_VIEW_ID \
  --instance=INSTANCE_ID \
  --table=TABLE_ID \
  --definition-file=DEFINITION_FILE_PATH

请替换以下内容:

  • AUTHORIZED_VIEW_ID:尚未用于表的授权视图的永久标识符
  • INSTANCE_ID:包含该表的实例的永久性标识符
  • TABLE_ID:您要为其创建授权视图的表的永久性标识符
  • DEFINITION_FILE_PATH:授权视图的有效 JSON 格式表示形式的路径。如需查看格式正确的定义文件示例,请参阅定义文件示例

您也可以在不提供定义文件的情况下运行该命令。在这种情况下,gcloud CLI 会打开一个编辑器并提示您输入值。

如需确认是否已创建授权视图,请获取表的授权视图列表

Java

如需了解如何安装和使用 Bigtable 客户端库,请参阅 Bigtable 客户端库

如需向 Bigtable 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

try {
  CreateAuthorizedViewRequest request =
      CreateAuthorizedViewRequest.of(tableId, authorizedViewId)
          .setAuthorizedViewType(
              SubsetView.create()
                  .addRowPrefix("")
                  .setFamilySubsets(
                      COLUMN_FAMILY,
                      FamilySubsets.create().addQualifierPrefix(COLUMN_QUALIFIER_NAME)));
  AuthorizedView authorizedView = adminClient.createAuthorizedView(request);
  System.out.printf("AuthorizedView: %s created successfully%n", authorizedView.getId());
} catch (NotFoundException e) {
  System.err.println(
      "Failed to create an authorized view from a non-existent table: " + e.getMessage());
}

修改已获授权的视图

gcloud

使用 bigtable authorized-views update 命令修改已获授权的视图。

gcloud bigtable authorized-views update AUTHORIZED_VIEW_ID \
  --instance=INSTANCE_ID \
  --table=TABLE_ID \
  --definition-file=DEFINITION_FILE_PATH

请替换以下内容:

  • AUTHORIZED_VIEW_ID:授权视图的永久标识符
  • INSTANCE_ID:实例的永久性标识符
  • TABLE_ID:源表的永久标识符
  • DEFINITION_FILE_PATH:授权视图的有效 JSON 格式表示形式的路径。如需查看格式正确的定义文件示例,请参阅定义文件示例

您也可以在不提供定义文件的情况下运行该命令。在这种情况下,gcloud CLI 会打开一个编辑器并提示您输入值。

可选:为防止 gcloud CLI 显示确认提示,显示当前授权视图结构与更新提交后之间的差异,请将 --no-interactive 标志附加到命令。

Java

如需了解如何安装和使用 Bigtable 客户端库,请参阅 Bigtable 客户端库

如需向 Bigtable 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

try {
  // Update to an authorized view permitting everything.
  UpdateAuthorizedViewRequest request =
      UpdateAuthorizedViewRequest.of(tableId, authorizedViewId)
          .setAuthorizedViewType(
              SubsetView.create()
                  .addRowPrefix("")
                  .setFamilySubsets(
                      COLUMN_FAMILY, FamilySubsets.create().addQualifierPrefix("")));
  AuthorizedView authorizedView = adminClient.updateAuthorizedView(request);
  System.out.printf("AuthorizedView: %s updated successfully%n", authorizedView.getId());
} catch (NotFoundException e) {
  System.err.println("Failed to modify a non-existent authorized view: " + e.getMessage());
}

启用或停用删除保护

如需为已获授权的视图启用删除保护,请在 update 命令中添加 --deletion-protection

如需停用删除保护,请在更新命令中添加 no-deletion-protection

删除已获授权的视图

如果您删除某个表,则该表的所有授权视图也将被删除。

如果您删除了已获授权的视图,则无法恢复删除。但是,如果您删除表,然后恢复删除的表,则该表的所有授权视图都将与表一起恢复。然后,您必须为已获授权的视图和表重新配置 IAM。如需了解详情,请参阅恢复删除的表

gcloud

使用 bigtable instances tables authorized-views delete 命令删除已获授权的视图。

gcloud bigtable authorized-views delete AUTHORIZED_VIEW_ID \
  --instance=INSTANCE_ID \
  --table=TABLE_ID

请替换以下内容:

  • AUTHORIZED_VIEW_ID:授权视图的永久标识符
  • INSTANCE_ID:实例的永久性标识符
  • TABLE_ID:源表的永久标识符

可选:为防止 gcloud CLI 显示要求您确认或取消删除的确认提示,请在命令后附加 --nointeractive 标志。

Java

如需了解如何安装和使用 Bigtable 客户端库,请参阅 Bigtable 客户端库

如需向 Bigtable 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

try {
  adminClient.deleteAuthorizedView(tableId, authorizedViewId);
  System.out.printf("AuthorizedView: %s deleted successfully%n", authorizedViewId);
} catch (NotFoundException e) {
  System.err.println("Failed to delete a non-existent authorized view: " + e.getMessage());
}

获取表的授权视图列表

gcloud

运行 bigtable authorized-views list 命令:

gcloud bigtable authorized-views list \
  --instance=INSTANCE_ID \
  --table=TABLE_ID

请替换以下内容:

  • INSTANCE_ID:实例的永久性标识符
  • TABLE_ID:表的永久标识符

Java

如需了解如何安装和使用 Bigtable 客户端库,请参阅 Bigtable 客户端库

如需向 Bigtable 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

List<String> authorizedViewIds = new ArrayList<>();
try {
  authorizedViewIds = adminClient.listAuthorizedViews(tableId);
  for (String authorizedViewId : authorizedViewIds) {
    System.out.println(authorizedViewId);
  }
} catch (NotFoundException e) {
  System.err.println(
      "Failed to list authorized views from a non-existent table: " + e.getMessage());
}

查看授权视图的相关详情

gcloud

如需获取有关授权视图的详细信息,请运行 bigtable instances tables authorized-views describe 命令:

gcloud bigtable authorized-views describe \
–-instance=INSTANCE_ID \
–-table=TABLE_ID \
–-view=AUTHORIZED_VIEW_ID

请替换以下内容:

  • INSTANCE_ID:实例的永久性标识符
  • TABLE_ID:表的永久标识符
  • AUTHORIZED_VIEW_ID:授权视图的永久标识符

Java

如需了解如何安装和使用 Bigtable 客户端库,请参阅 Bigtable 客户端库

如需向 Bigtable 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

AuthorizedView authorizedView = null;
try {
  authorizedView = adminClient.getAuthorizedView(tableId, authorizedViewId);
  SubsetView subsetView = (SubsetView) authorizedView.getAuthorizedViewType();

  for (ByteString rowPrefix : subsetView.getRowPrefixes()) {
    System.out.printf("Row Prefix: %s%n", rowPrefix.toStringUtf8());
  }
  for (Map.Entry<String, FamilySubsets> entry : subsetView.getFamilySubsets().entrySet()) {
    for (ByteString qualifierPrefix : entry.getValue().getQualifierPrefixes()) {
      System.out.printf(
          "Column Family: %s, Qualifier Prefix: %s%n",
          entry.getKey(), qualifierPrefix.toStringUtf8());
    }
    for (ByteString qualifier : entry.getValue().getQualifiers()) {
      System.out.printf(
          "Column Family: %s, Qualifier: %s%n", entry.getKey(), qualifier.toStringUtf8());
    }
  }
} catch (NotFoundException e) {
  System.err.println(
      "Failed to retrieve metadata from a non-existent authorized view: " + e.getMessage());
}

后续步骤