管理视图

本文档介绍了如何在 BigQuery 中管理视图。您可以通过以下方式管理 BigQuery 视图:

准备工作

授予为用户提供执行本文档中的每个任务所需权限的 Identity and Access Management (IAM) 角色。执行任务所需的权限(如果有)列出在任务的“所需权限”部分中。

更新视图

创建视图后,您可以更新以下视图属性:

所需权限

如需更新视图,您需要拥有以下 IAM 权限:

  • bigquery.tables.update
  • bigquery.tables.get

以下每个预定义 IAM 角色都包含更新视图所需的权限:

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

此外,如果您拥有 bigquery.datasets.create 权限,则可以更新您自己创建的数据集中的表和视图。

如需更新视图的 SQL 查询,您还必须有权限查询视图的 SQL 查询所引用的任何表。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅预定义的角色和权限

更新视图的 SQL 查询

您可以通过以下方式更新用于定义视图的 SQL 查询:

  • 使用 Google Cloud 控制台
  • 使用 bq 命令行工具的 bq update 命令
  • 调用 tables.patch API 方法
  • 使用客户端库

您可以在 API 或 bq 命令行工具中将 SQL 方言从旧版 SQL 更改为 GoogleSQL。在 Google Cloud 控制台中,您无法将旧版 SQL 视图更新为 GoogleSQL。

更新视图的 SQL 查询的方法如下:

控制台

  1. 探索器面板中,展开您的项目和数据集,然后选择视图。

  2. 点击详情标签页。

  3. 查询框上方,点击修改查询按钮。在随即显示的对话框中点击打开

    修改查询

  4. 查询编辑器框中修改 SQL 查询,然后点击保存视图

    保存视图

  5. 确保保存视图对话框中的所有字段都正确无误,然后点击保存

bq

发出带 --view 标志的 bq update 命令。如需使用 GoogleSQL 或者将查询方言从旧版 SQL 更新为 GoogleSQL,请添加 --use_legacy_sql 标志并将其设置为 false

如果您的查询引用了存储在 Google Cloud Storage 或本地文件中的外部用户定义函数资源,请使用 --view_udf_resource 标志指定这些资源。此处未显示 --view_udf_resource 标志。如需详细了解如何使用用户指定函数 (UDF),请参阅 GoogleSQL 用户定义的函数

如果您要更新非默认项目中的视图,请按以下格式将项目 ID 添加到数据集名称中:project_id:dataset

bq update \
    --use_legacy_sql=false \
    --view_udf_resource=path_to_file \
    --view='query' \
    project_id:dataset.view

替换以下内容:

  • path_to_file:代码文件的 URI 或本地文件系统路径,该代码文件会立即作为视图使用的用户定义的函数资源进行加载和评估。重复使用该标志可指定多个文件。
  • query:有效的 GoogleSQL 查询
  • project_id:您的项目 ID
  • dataset:要更新的视图所属数据集的名称
  • view:要更新的视图的名称

示例

输入以下命令以更新 mydataset 中名为 myview 的视图的 SQL 查询。mydataset 属于默认项目。用于更新视图的示例查询会从美国姓名数据公开数据集中查询数据。

bq update \
    --use_legacy_sql=false \
    --view \
    'SELECT
      name,
      number
    FROM
      `bigquery-public-data.usa_names.usa_1910_current`
    WHERE
      gender = "M"
    ORDER BY
      number DESC;' \
    mydataset.myview

输入以下命令以更新 mydataset 中名为 myview 的视图的 SQL 查询。mydataset 属于 myotherproject,而非默认项目。用于更新视图的示例查询会从美国姓名数据公开数据集中查询数据。

bq update \
    --use_legacy_sql=false \
    --view \
    'SELECT
      name,
      number
    FROM
      `bigquery-public-data.usa_names.usa_1910_current`
    WHERE
      gender = "M"
    ORDER BY
      number DESC;' \
    myotherproject:mydataset.myview

API

要更新视图,可使用包含已更新的 view 属性的表资源调用 tables.patch 方法。由于 tables.update 方法会替换整个表资源,因此最好使用 tables.patch 方法。

Go

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

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

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// updateView demonstrates updating the query metadata that defines a logical view.
func updateView(projectID, datasetID, viewID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// viewID := "myview"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	view := client.Dataset(datasetID).Table(viewID)
	meta, err := view.Metadata(ctx)
	if err != nil {
		return err
	}

	newMeta := bigquery.TableMetadataToUpdate{
		// This example updates a view into the shakespeare dataset to exclude works named after kings.
		ViewQuery: "SELECT word, word_count, corpus, corpus_date FROM `bigquery-public-data.samples.shakespeare` WHERE corpus NOT LIKE '%king%'",
	}

	if _, err := view.Update(ctx, newMeta, meta.ETag); err != nil {
		return err
	}
	return nil
}

Java

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

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

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 com.google.cloud.bigquery.TableInfo;
import com.google.cloud.bigquery.ViewDefinition;

// Sample to update query on a view
public class UpdateViewQuery {

  public static void runUpdateViewQuery() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String viewName = "MY_VIEW_NAME";
    String updateQuery =
        String.format("SELECT TimestampField, StringField FROM %s.%s", datasetName, tableName);
    updateViewQuery(datasetName, viewName, updateQuery);
  }

  public static void updateViewQuery(String datasetName, String viewName, String query) {
    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();

      // Retrieve existing view metadata
      TableInfo viewMetadata = bigquery.getTable(TableId.of(datasetName, viewName));

      // Update view query
      ViewDefinition viewDefinition = viewMetadata.getDefinition();
      viewDefinition.toBuilder().setQuery(query).build();

      // Set metadata
      bigquery.update(viewMetadata.toBuilder().setDefinition(viewDefinition).build());

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

Node.js

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

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

// Import the Google Cloud client library and create a client
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function updateViewQuery() {
  // Updates a view named "my_existing_view" in "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_existing_dataset"
  // const tableId = "my_existing_table"
  const dataset = await bigquery.dataset(datasetId);

  // This example updates a view into the USA names dataset to include state.
  const newViewQuery = `SELECT name, state 
  FROM \`bigquery-public-data.usa_names.usa_1910_current\`
  LIMIT 10`;

  // Retrieve existing view
  const [view] = await dataset.table(tableId).get();

  // Retrieve existing view metadata
  const [metadata] = await view.getMetadata();

  // Update view query
  metadata.view = newViewQuery;

  // Set metadata
  await view.setMetadata(metadata);

  console.log(`View ${tableId} updated.`);
}

Python

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

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

from google.cloud import bigquery

client = bigquery.Client()

view_id = "my-project.my_dataset.my_view"
source_id = "my-project.my_dataset.my_table"
view = bigquery.Table(view_id)

# The source table in this example is created from a CSV file in Google
# Cloud Storage located at
# `gs://cloud-samples-data/bigquery/us-states/us-states.csv`. It contains
# 50 US states, while the view returns only those states with names
# starting with the letter 'M'.
view.view_query = f"SELECT name, post_abbr FROM `{source_id}` WHERE name LIKE 'M%'"

# Make an API request to update the query property of the view.
view = client.update_table(view, ["view_query"])
print(f"Updated {view.table_type}: {str(view.reference)}")

更新视图的到期时间

您可以在数据集级层设置默认的视图到期时间,也可以在创建视图时设置视图的到期时间。如果在创建视图时设置到期时间,则会忽略数据集的默认表到期时间。如果未在数据集级层设置默认表到期时间,也未在创建视图时设置到期时间,则视图永不过期,您必须手动删除视图。

创建视图后,随时都可通过以下方式更新视图的到期时间:

  • 使用 Google Cloud 控制台
  • 使用以 GoogleSQL 语法编写的数据定义语言 (DDL) 语句
  • 使用 bq 命令行工具的 bq update 命令
  • 调用 tables.patch API 方法
  • 使用客户端库

要更新视图的到期时间,请执行以下操作:

控制台

  1. 在导航窗格中,选择视图。

  2. 在视图的“详细信息”页面上,点击详细信息标签页。

  3. 视图信息右侧,点击修改图标(铅笔)。

  4. 视图信息对话框中,对于视图过期,点击指定日期

  5. 在日期选择器中,输入到期日期和时间,然后点击确定

  6. 点击更新。更新后的到期时间会显示在视图信息部分中。

SQL

使用 ALTER VIEW SET OPTIONS DDL 语句

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

    转到 BigQuery

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

     ALTER VIEW DATASET_ID.MY_VIEW
     SET OPTIONS (
      expiration_timestamp = TIMESTAMP('NEW_TIMESTAMP'));

    替换以下内容:

    • DATASET_ID:您的视图所属数据集的 ID
    • MY_VIEW:要更新的视图的名称
    • NEW_TIMESTAMPTIMESTAMP 值

  3. 点击 运行

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

bq

发出带 --expiration 标志的 bq update 命令。如果您要更新非默认项目中的视图,请按以下格式将项目 ID 添加到数据集名称中:project_id:dataset

bq update \
    --expiration integer \
    project_id:dataset.view

替换以下内容:

  • integer:表的默认生命周期(以秒为单位)。最小值为 3600 秒(一小时)。到期时间以当前时间加上这个整数值为准。
  • project_id:您的项目 ID
  • dataset:要更新的视图所属数据集的名称
  • view:要更新的视图的名称

示例

输入以下命令可将 mydatasetmyview 的到期时间更新为 5 天(432000 秒)。mydataset 属于默认项目。

bq update \
    --expiration 432000 \
    mydataset.myview

输入以下命令可将 mydatasetmyview 的到期时间更新为 5 天(432000 秒)。mydataset 属于 myotherproject,而非默认项目。

bq update \
    --expiration 432000 \
    myotherproject:mydataset.myview

API

调用 tables.patch 方法并使用表资源中的 expirationTime 属性。由于 tables.update 方法会替换整个表资源,因此建议使用 tables.patch 方法。使用 REST API 时,视图的到期时间以毫秒为单位表示。

Go

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

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

import (
	"context"
	"fmt"
	"time"

	"cloud.google.com/go/bigquery"
)

// updateTableExpiration demonstrates setting the table expiration of a table to a specific point in time
// in the future, at which time it will be deleted.
func updateTableExpiration(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	tableRef := client.Dataset(datasetID).Table(tableID)
	meta, err := tableRef.Metadata(ctx)
	if err != nil {
		return err
	}
	update := bigquery.TableMetadataToUpdate{
		ExpirationTime: time.Now().Add(time.Duration(5*24) * time.Hour), // table expiration in 5 days.
	}
	if _, err = tableRef.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

Java

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

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

Table beforeTable = bigquery.getTable(datasetName, tableName);

// Set table to expire 5 days from now.
long expirationMillis = DateTime.now().plusDays(5).getMillis();
TableInfo tableInfo = beforeTable.toBuilder()
        .setExpirationTime(expirationMillis)
        .build();
Table afterTable = bigquery.update(tableInfo);

Node.js

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

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

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function updateTableExpiration() {
  // Updates a table's expiration.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = 'my_dataset', // Existing dataset
  // const tableId = 'my_table', // Existing table
  // const expirationTime = Date.now() + 1000 * 60 * 60 * 24 * 5 // 5 days from current time in ms

  // Retreive current table metadata
  const table = bigquery.dataset(datasetId).table(tableId);
  const [metadata] = await table.getMetadata();

  // Set new table expiration to 5 days from current time
  metadata.expirationTime = expirationTime.toString();
  const [apiResponse] = await table.setMetadata(metadata);

  const newExpirationTime = apiResponse.expirationTime;
  console.log(`${tableId} expiration: ${newExpirationTime}`);
}

Python

更新视图到期时间的过程与更新表到期时间的过程相同。

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

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

from google.cloud import bigquery

client = bigquery.Client()

# TODO(dev): Change table_id to the full name of the table you want to update.
table_id = "your-project.your_dataset.your_table_name"

# TODO(dev): Set table to expire for desired days days from now.
expiration = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(
    days=5
)
table = client.get_table(table_id)  # Make an API request.
table.expires = expiration
table = client.update_table(table, ["expires"])  # API request

print(f"Updated {table_id}, expires {table.expires}.")

更新视图的说明

您可以通过以下方式更新视图的说明:

  • 使用 Google Cloud 控制台
  • 使用以 GoogleSQL 语法编写的数据定义语言 (DDL) 语句
  • 使用 bq 命令行工具的 bq update 命令
  • 调用 tables.patch API 方法
  • 使用客户端库

要更新视图的说明,请执行以下操作:

控制台

使用 Google Cloud 控制台创建视图时,您无法添加说明。创建视图后,您可以在详细信息页面上添加说明。

  1. 探索器面板中,展开您的项目和数据集,然后选择视图。

  2. 点击详情标签页。

  3. 点击说明旁边的铅笔图标。

    修改视图说明

  4. 在对话框中输入说明。点击更新以保存新说明。

SQL

使用 ALTER VIEW SET OPTIONS DDL 语句

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

    转到 BigQuery

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

     ALTER VIEW DATASET_ID.MY_VIEW
     SET OPTIONS (
      description = 'NEW_DESCRIPTION');

    替换以下内容:

    • DATASET_ID:您的视图所属数据集的 ID
    • MY_VIEW:要更新的视图的名称
    • NEW_DESCRIPTION:新视图说明

  3. 点击 运行

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

bq

发出带 --description 标志的 bq update 命令。如果您要更新非默认项目中的视图,请按以下格式将项目 ID 添加到数据集名称中:[PROJECT_ID]:[DATASET]

bq update \
    --description "description" \
    project_id:dataset.view

替换以下内容:

  • description:描述视图的文本,括在英文引号之间
  • project_id:您的项目 ID。
  • dataset:要更新的视图所属数据集的名称
  • view:要更新的视图的名称

示例

输入以下命令,将 mydatasetmyview 的说明更改为“Description of myview”。mydataset 属于默认项目。

bq update \
    --description "Description of myview" \
    mydataset.myview

输入以下命令,将 mydatasetmyview 的说明更改为“Description of myview”。mydataset 属于 myotherproject,而非默认项目。

bq update \
    --description "Description of myview" \
    myotherproject:mydataset.myview

API

调用 tables.patch 方法并使用 description 属性更新表资源中的视图说明。由于 tables.update 方法会替换整个表资源,因此建议使用 tables.patch 方法。

Go

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

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

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// updateTableDescription demonstrates how to fetch a table's metadata and updates the Description metadata.
func updateTableDescription(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	tableRef := client.Dataset(datasetID).Table(tableID)
	meta, err := tableRef.Metadata(ctx)
	if err != nil {
		return err
	}
	update := bigquery.TableMetadataToUpdate{
		Description: "Updated description.",
	}
	if _, err = tableRef.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

Java

更新视图说明的过程与更新表说明的过程相同。

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

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

// String datasetName = "my_dataset_name";
// String tableName = "my_table_name";
// String newDescription = "new_description";

Table beforeTable = bigquery.getTable(datasetName, tableName);
TableInfo tableInfo = beforeTable.toBuilder()
    .setDescription(newDescription)
    .build();
Table afterTable = bigquery.update(tableInfo);

Node.js

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

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

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function updateTableDescription() {
  // Updates a table's description.

  // Retreive current table metadata
  const table = bigquery.dataset(datasetId).table(tableId);
  const [metadata] = await table.getMetadata();

  // Set new table description
  const description = 'New table description.';
  metadata.description = description;
  const [apiResponse] = await table.setMetadata(metadata);
  const newDescription = apiResponse.description;

  console.log(`${tableId} description: ${newDescription}`);
}

Python

更新视图说明的过程与更新表说明的过程相同。

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

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

# from google.cloud import bigquery
# client = bigquery.Client()
# project = client.project
# dataset_ref = bigquery.DatasetReference(project, dataset_id)
# table_ref = dataset_ref.table('my_table')
# table = client.get_table(table_ref)  # API request

assert table.description == "Original description."
table.description = "Updated description."

table = client.update_table(table, ["description"])  # API request

assert table.description == "Updated description."

复制视图

您可以使用 Google Cloud 控制台复制视图。

您无法使用 bq 命令行工具、REST API 或客户端库复制视图,但可以复制目标数据集中的视图

所需权限

如需在 Google Cloud 控制台中复制视图,您需要拥有源数据集和目标数据集的 IAM 权限。

  • 在源数据集上,您需要以下权限:

    • bigquery.tables.get
    • bigquery.tables.getData(访问视图的 SQL 查询引用的表时需要)
  • 在目标数据集上,您需要以下权限:

    • bigquery.tables.create(可让您在目标数据集中创建视图的副本)

以下每个预定义 IAM 角色都包含复制视图所需的权限:

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

此外,如果您拥有 bigquery.datasets.create 权限,则可以在自己创建的数据集中复制视图。除非您创建了目标数据集,否则还需要拥有目标数据集的访问权限。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅预定义的角色和权限

复制视图

要复制视图,请执行以下操作:

  1. 探索器面板中,展开您的项目和数据集,然后选择视图。

  2. 在详细信息面板中,点击复制视图

  3. 复制视图对话框中,执行以下操作:

    • 来源 (Source) 部分中,验证您的项目名称数据集名称表名称是否正确无误。
    • 目标 (Destination) 部分中执行如下设置:

      • 对于项目名称,选择要将视图复制到哪个项目。
      • 对于数据集名称,选择要包含所复制视图的数据集。
      • 对于表名称,输入该视图的名称。您可以在框中输入新的视图名称,以便更改视图名称。如果要输入新名称,这个新名称必须遵循视图命名规则。

      “复制视图”对话框

    • 点击复制

适用复制作业的限制。如需了解详情,请参阅配额和限制

重命名视图

目前,只有在使用 Google Cloud 控制台复制视图时才能重命名视图。有关在复制视图时对视图进行重命名的说明,请参阅复制视图

您无法使用 bq 命令行工具、API 或客户端库更改现有视图的名称。如有相应需要,您必须使用新名称重新创建视图

删除视图

您可以通过以下方式删除视图:

  • 使用 Google Cloud 控制台
  • 使用 bq 命令行工具的 bq rm 命令
  • 调用 tables.delete API 方法

目前,无论使用何种方法,您每次只能删除一个视图。

若要在指定的时间段后自动删除视图,请设置数据集级别的默认到期时间,或在创建视图时设置到期时间。

删除已获授权的视图时,最多可能需要 24 小时才能从源数据集的已获授权的视图列表中移除已删除的视图。

删除视图也会删除与此视图关联的所有权限。重新创建已删除的视图时,您还必须手动重新配置之前与其关联的任何访问权限

所需权限

如需删除视图,您需要拥有以下 IAM 权限:

  • bigquery.tables.delete

以下每个预定义 IAM 角色都包含删除视图所需的权限:

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

此外,如果您拥有 bigquery.datasets.create 权限,则可以在自己创建的数据集中删除视图。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅预定义的角色和权限

删除视图

删除视图的方法如下:

控制台

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

    转到 BigQuery

  2. 探索器面板中,展开您的项目和数据集,然后选择视图。

  3. 在详细信息面板中,点击删除视图

  4. 在对话框中输入 "delete",然后点击删除进行确认。

SQL

使用 DROP VIEW DDL 语句

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

    转到 BigQuery

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

    DROP VIEW mydataset.myview;

    替换以下内容:

    • DATASET_ID:您的视图所属数据集的 ID
    • MY_VIEW:要更新的视图的名称
    • NEW_DESCRIPTION:新视图说明

  3. 点击 运行

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

bq

使用带有 --table 标志(或 -t 快捷方式)的 bq rm 命令删除视图。当您使用 bq 命令行工具移除视图时,必须确认操作。您可以使用 --force 标志(或 -f 快捷方式)跳过确认。

如果该视图属于非默认项目中的数据集,请按以下格式将相应项目 ID 添加到数据集名称中:project_id:dataset

bq rm \
-f \
-t \
project_id:dataset.view

其中:

  • project_id 是项目 ID。
  • dataset 是包含该表的数据集的名称。
  • view 是要删除的视图的名称。

示例:

您可以使用 bq 命令行工具运行 bq 命令。

在 Google Cloud 控制台控制台中,激活 Cloud Shell

激活 Cloud Shell

输入以下命令可从 mydataset 删除 myviewmydataset 在默认项目中。

bq rm -t mydataset.myview

输入以下命令可从 mydataset 删除 myviewmydatasetmyotherproject 中,不在默认项目中。

bq rm -t myotherproject:mydataset.myview

输入以下命令可从 mydataset 删除 myviewmydataset 在默认项目中。该命令使用 -f 快捷方式绕过确认。

bq rm -f -t mydataset.myview

API

调用 tables.delete API 方法并使用 tableId 参数指定要删除的视图。

C#

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

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


using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryDeleteTable
{
    public void DeleteTable(
        string projectId = "your-project-id",
        string datasetId = "your_dataset_id",
        string tableId = "your_table_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        client.DeleteTable(datasetId, tableId);
        Console.WriteLine($"Table {tableId} deleted.");
    }
}

Go

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

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

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// deleteTable demonstrates deletion of a BigQuery table.
func deleteTable(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	table := client.Dataset(datasetID).Table(tableID)
	if err := table.Delete(ctx); err != nil {
		return err
	}
	return nil
}

Java

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

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

TableId tableId = TableId.of(projectId, datasetName, tableName);
boolean deleted = bigquery.delete(tableId);
if (deleted) {
  // the table was deleted
} else {
  // the table was not found
}

Node.js

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

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

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function deleteTable() {
  // Deletes "my_table" from "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // const tableId = "my_table";

  // Delete the table
  await bigquery
    .dataset(datasetId)
    .table(tableId)
    .delete();

  console.log(`Table ${tableId} deleted.`);
}

PHP

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

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

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $tableId = 'The BigQuery table ID';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$table = $dataset->table($tableId);
$table->delete();
printf('Deleted table %s.%s' . PHP_EOL, $datasetId, $tableId);

Python

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

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


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to fetch.
# table_id = 'your-project.your_dataset.your_table'

# If the table does not exist, delete_table raises
# google.api_core.exceptions.NotFound unless not_found_ok is True.
client.delete_table(table_id, not_found_ok=True)  # Make an API request.
print("Deleted table '{}'.".format(table_id))

Ruby

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

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

require "google/cloud/bigquery"

def delete_table dataset_id = "my_dataset_id", table_id = "my_table_id"
  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id
  table    = dataset.table table_id

  table.delete

  puts "Table #{table_id} deleted."
end

恢复视图

您无法直接恢复已删除的视图,但在某些情况下,可以使用权宜解决方法:

  • 如果视图因父级数据集被删除而被删除,您可以取消删除数据集以检索视图。
  • 如果视图被显式删除,您可以使用上次用于创建或更新视图的查询重新创建视图。您可以在日志中找到视图创建或更新操作的查询定义。

视图安全性

如需控制对 BigQuery 中视图的访问权限,请参阅授权视图

后续步骤