Actualiza propiedades de vista

En este documento, se describe cómo actualizar las propiedades de vista o metadatos. Después de crear una vista, puedes actualizar las propiedades de vista siguientes:

Permisos necesarios

Como mínimo, para actualizar una vista, debes tener los permisos bigquery.tables.update y bigquery.tables.get. Si actualizas la consulta de SQL de la vista, también debes tener permisos para consultar las tablas a las que hace referencia la consulta de SQL de la vista.

Las siguientes funciones predefinidas de IAM incluyen los permisos bigquery.tables.update y bigquery.tables.get:

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

Además, si un usuario tiene permisos bigquery.datasets.create, se le otorga el acceso bigquery.dataOwner cuando crea un conjunto de datos. El acceso bigquery.dataOwner permite al usuario actualizar tablas y vistas en el conjunto de datos.

Para obtener más información sobre las funciones y los permisos de IAM en BigQuery, consulta Funciones y permisos predefinidos.

Actualiza una consulta de SQL de una vista

Puedes actualizar la consulta de SQL que se usa para definir una vista si sigues estos pasos:

  • Usa Cloud Console.
  • Usar el comando bq update de la herramienta de línea de comandos de bq
  • Llamar al método de la API tables.patch
  • Usa bibliotecas cliente.

Puedes cambiar el dialecto de SQL de SQL heredado a SQL estándar en la API o en la herramienta de línea de comandos de bq. No puedes actualizar una vista SQL heredada a SQL estándar en Cloud Console.

Para actualizar la consulta de SQL de una vista, sigue estos pasos:

Console

  1. En el panel Explorador, expande tu proyecto y conjunto de datos y, luego, selecciona la vista.

  2. Haz clic en la pestaña Detalles.

  3. Arriba del cuadro Query, haz clic en el botón Edit query. Haz clic en Open en el cuadro de diálogo que aparece.

    Editar consulta

  4. Edita la consulta de SQL en el cuadro Query editor y, luego, haz clic en Save view.

    Guardar vista

  5. Asegúrate de que todos los campos del diálogo Save view sean correctos y, luego, haz clic en Save.

bq

Ejecuta el comando bq update con la marca --view. Si quieres usar SQL estándar o actualizar el dialecto de consulta de SQL heredado a SQL estándar, debes incluir la marca --use_legacy_sql y establecerla en false.

Si tu consulta hace referencia a recursos de funciones externas definidas por el usuario almacenadas en Cloud Storage o en archivos locales, usa la marca --view_udf_resource para especificar esos recursos. La marca --view_udf_resource no se muestra aquí. Para obtener más información sobre cómo usar UDF, consulta Funciones definidas por el usuario de SQL estándar.

Si actualizas una vista en un proyecto que no es tu proyecto predeterminado, debes agregar el ID del proyecto al nombre del conjunto de datos en el formato siguiente: project_id:dataset.

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

En el ejemplo anterior, se ilustra lo siguiente:

  • path_to_file es el URI o la ruta de acceso del sistema de archivos local a un archivo de código que se cargará y evaluará de inmediato como un recurso de función definida por el usuario que usa la vista. Repite la marca para especificar varios archivos.
  • query es una consulta válida de SQL estándar.
  • project_id es el ID del proyecto.
  • dataset es un conjunto de datos que contiene la vista.
  • view es el nombre de la vista que deseas actualizar.

Ejemplos:

Ingresa el comando siguiente si quieres actualizar la consulta de SQL de una vista llamada myview en mydataset. mydataset está en tu proyecto predeterminado. La consulta de ejemplo que se usa para actualizar los datos de consultas de vista del conjunto de datos públicos Datos de nombres de EE.UU.

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

Ingresa el comando siguiente si quieres actualizar la consulta de SQL de una vista llamada myview en mydataset. mydataset está en myotherproject, no en tu proyecto predeterminado. La consulta de ejemplo que se usa para actualizar la vista solicita información del conjunto de datos públicos de nombres de EE.UU.

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

Puedes actualizar una vista si llamas al método tables.patch con un recurso de tabla que contiene una propiedad view actualizada. Debido a que se reemplaza todo el recurso de tabla usando el método tables.update, es preferible usar el método tables.patch.

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Go de 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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la Documentación de referencia de la API de Node.js de 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

Antes de probar esta muestra, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de 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)}")

Actualiza la hora de vencimiento de una vista

Puedes establecer una hora de vencimiento de una tabla predeterminada en el nivel de conjunto de datos (que afecta tanto a las tablas como a las vistas) o puedes establecer la hora de vencimiento de una vista cuando esta se crea. Si estableces el vencimiento cuando se crea la vista, se ignora el vencimiento predeterminado de las tablas del conjunto de datos. Si no estableces un vencimiento de la tabla predeterminada en el nivel de conjunto de datos y no estableces un vencimiento cuando se crea la vista, esta nunca vence y debes borrarla de forma manual.

En cualquier momento posterior a la creación de la vista, puedes actualizar la hora de vencimiento de la vista si sigues estos pasos:

  • Usar el comando bq update de la herramienta de línea de comandos de bq
  • Llamar al método de la API tables.patch
  • Con las bibliotecas cliente

Para actualizar el tiempo de vencimiento de una vista, sigue estos pasos:

Console

  1. En el panel de navegación, selecciona la vista.

  2. En la página de detalles de la vista, haz clic en la pestaña Detalles.

  3. A la derecha de Ver información, haz clic en el ícono de edición (lápiz).

  4. En el cuadro de diálogo View info, en View expiration, haz clic en Specify date.

  5. En el selector de fecha, ingresa la fecha y hora de vencimiento y, luego, haz clic en Aceptar.

  6. Haz clic en Actualizar. La fecha de vencimiento actualizada aparecerá en la sección View info.

SQL

Las declaraciones del lenguaje de definición de datos (DDL) te permiten crear y modificar tablas y vistas con la sintaxis de consulta de SQL estándar.

Para obtener más información, consulta cómo usar instrucciones del lenguaje de definición de datos.

Para usar una declaración de DDL en Cloud Console, haz lo siguiente:

  1. Haz clic en Redactar consulta nueva.

  2. Escribe tu declaración de DDL en el área de texto Editor de consultas.

    ALTER VIEW mydataset.myview
    SET OPTIONS (
    -- Sets view expiration to timestamp 2025-02-03 12:34:56 in the America/Los Angeles time zone
    expiration_timestamp=TIMESTAMP("2025-02-03 12:34:56", "America/Los_Angeles")
    );
    
  3. Haga clic en Run query.

bq

Ejecuta el comando bq update con la marca --expiration. Si actualizas una vista en un proyecto que no es tu proyecto predeterminado, debes agregar el ID del proyecto al nombre del conjunto de datos en el formato siguiente: project_id:dataset.

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

En el ejemplo anterior, se ilustra lo siguiente:

  • integer es el ciclo de vida predeterminado (en segundos) de la tabla. El valor mínimo es 3,600 segundos (una hora). El vencimiento se evalúa según la suma de la fecha actual y el valor de número entero.
  • project_id es el ID del proyecto.
  • dataset es el nombre del conjunto de datos que contiene la vista que deseas actualizar.
  • view es el nombre de la vista que deseas actualizar.

Ejemplos:

Ingresa el comando siguiente a fin de actualizar la fecha de vencimiento de myview en mydataset a 5 días (432,000 segundos). mydataset está en tu proyecto predeterminado.

bq update --expiration 432000 mydataset.myview

Ingresa el comando siguiente a fin de actualizar la fecha de vencimiento de myview en mydataset a 5 días (432,000 segundos). mydataset está en myotherproject, no en tu proyecto predeterminado.

bq update --expiration 432000 myotherproject:mydataset.myview

API

Realiza una llamada al método tables.patch y usa la propiedad expirationTime en el recurso de tabla. Debido a que se reemplaza todo el recurso de tabla con el método tables.update, es preferible usar el método tables.patch. Cuando usas la API de REST, el vencimiento de la vista se expresa en milisegundos.

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Go de 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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la Documentación de referencia de la API de Node.js de 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

El proceso para actualizar el vencimiento de una vista es el mismo que se usa para actualizar el vencimiento de una tabla.

Antes de probar esta muestra, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

import datetime
import pytz

# 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.expires is None

# set table to expire 5 days from now
expiration = datetime.datetime.now(pytz.utc) + datetime.timedelta(days=5)
table.expires = expiration
table = client.update_table(table, ["expires"])  # API request

# expiration is stored in milliseconds
margin = datetime.timedelta(microseconds=1000)
assert expiration - margin <= table.expires <= expiration + margin

Actualiza la descripción de una vista

Puedes actualizar la descripción de una vista si sigues estos pasos:

  • Usa Cloud Console.
  • Usar el comando bq update de la herramienta de línea de comandos de bq
  • Llamar al método de la API tables.patch
  • Con las bibliotecas cliente

Para actualizar la descripción de una vista, sigue estos pasos:

Console

Cuando creas una vista con Cloud Console, no puedes agregar una descripción. Después de crear la vista, puedes agregar una descripción en la página Detalles.

  1. En el panel Explorador, expande tu proyecto y conjunto de datos y, luego, selecciona la vista.

  2. Haz clic en la pestaña Detalles.

  3. Haz clic en el ícono de lápiz junto a Description (Descripción).

    Editar la descripción de la vista

  4. Ingresa una descripción en el cuadro de diálogo. Haz clic en Actualizar para guardar la descripción nueva.

SQL

Las declaraciones del lenguaje de definición de datos (DDL) te permiten crear y modificar tablas y vistas con la sintaxis de consulta de SQL estándar.

Para obtener más información, consulta cómo usar instrucciones del lenguaje de definición de datos.

Para usar una declaración de DDL en Cloud Console, haz lo siguiente:

  1. Haz clic en Redactar consulta nueva.

  2. Escribe tu declaración de DDL en el área de texto Editor de consultas.

     ALTER VIEW mydataset.myview
     SET OPTIONS (
       description="Description of myview"
     );
     

  3. Haga clic en Run query.

bq

Ejecuta el comando bq update con la marca --description. Si actualizas una vista en un proyecto que no es tu proyecto predeterminado, debes agregar el ID del proyecto al nombre del conjunto de datos en el formato siguiente: [PROJECT_ID]:[DATASET].

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

En el ejemplo anterior, se ilustra lo siguiente:

  • description es el texto que describe la vista entre comillas.
  • project_id es el ID del proyecto.
  • dataset es el nombre del conjunto de datos que contiene la vista que deseas actualizar.
  • view es el nombre de la vista que deseas actualizar.

Ejemplos:

Ingresa el comando siguiente para cambiar la descripción de myview en mydataset a “Descripción de mi vista” (Description of myview). mydataset está en tu proyecto predeterminado.

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

Ingresa el comando siguiente para cambiar la descripción de myview en mydataset a “Descripción de mi vista” (Description of myview). mydataset está en myotherproject, no en tu proyecto predeterminado.

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

API

Realiza una llamada al método tables.patch y usa la propiedad description para actualizar la descripción de la vista en el recurso de tabla. Debido a que se reemplaza todo el recurso de tabla con el método tables.update, es preferible usar el método tables.patch.

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Go de 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

El proceso para actualizar la descripción de una vista es el mismo que se usa para actualizar la de una tabla.

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

// 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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la Documentación de referencia de la API de Node.js de 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

El proceso para actualizar la descripción de una vista es el mismo que se usa para actualizar la de una tabla.

Antes de probar esta muestra, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de 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."

Ver la seguridad

Para controlar el acceso a las vistas de BigQuery, consulta Controla el acceso a las vistas.

Próximos pasos