Mettre à jour les propriétés d'une vue

Ce document explique comment mettre à jour les propriétés ou les métadonnées d'une vue. Une fois que vous avez créé une vue, vous pouvez mettre à jour les propriétés suivantes :

Autorisations requises

Pour mettre à jour une vue, vous devez au minimum disposer des autorisations bigquery.tables.update et bigquery.tables.get. Si vous mettez à jour la requête SQL d'une vue, vous devez également être autorisé à interroger les tables référencées par la requête SQL.

Les rôles IAM prédéfinis suivants incluent les autorisations bigquery.tables.update et bigquery.tables.get :

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

En outre, si un utilisateur possède les autorisations bigquery.datasets.create, il obtient également un accès bigquery.dataOwner à l'ensemble de données qu'il crée. L'accès bigquery.dataOwner permet à l'utilisateur de mettre à jour les tables et les vues de l'ensemble de données.

Pour en savoir plus sur les rôles et les autorisations IAM dans BigQuery, consultez la page Rôles prédéfinis et autorisations.

Mettre à jour la requête SQL d'une vue

Vous pouvez mettre à jour la requête SQL utilisée pour définir une vue de plusieurs façons :

  • Utiliser Cloud Console
  • Exécuter la commande bq update de l'outil de ligne de commande bq
  • En appelant la méthode API tables.patch
  • Utiliser les bibliothèques clientes

Vous pouvez faire passer le dialecte SQL de l'ancien SQL au SQL standard dans l'API ou l'outil de ligne de commande bq. Vous ne pouvez pas mettre à jour une vue en ancien SQL vers SQL standard dans Cloud Console.

Pour mettre à jour la requête SQL d'une vue :

Console

  1. Dans le panneau Explorateur, développez votre projet et votre ensemble de données, puis sélectionnez la vue.

  2. Cliquez sur l'onglet Détails.

  3. Au-dessus de la zone Requête, cliquez sur le bouton Modifier la requête. Cliquez sur Open (Ouvrir) dans la boîte de dialogue qui apparaît.

    Modifier la requête

  4. Modifiez la requête SQL dans la zone de l'éditeur de requête, puis cliquez sur Save view (Enregistrer l'affichage).

    Enregistrer l'affichage

  5. Vérifiez que tous les champs sont corrects dans la boîte de dialogue Enregistrer l'affichage avant de cliquer sur Enregistrer.

bq

Exécutez la commande bq update avec l'option --view. Pour utiliser le SQL standard, ou pour faire passer le dialecte des requêtes de l'ancien SQL au SQL standard, incluez l'option --use_legacy_sql et définissez-la sur false.

Si votre requête fait référence à des ressources externes de fonction définie par l'utilisateur, stockées dans Cloud Storage ou dans des fichiers locaux, spécifiez ces ressources à l'aide de l'option --view_udf_resource. L'option --view_udf_resource n'est pas présentée ici. Pour en savoir plus sur l'utilisation des fonctions définies par l'utilisateur, consultez la page Fonctions définies par l'utilisateur en SQL standard.

Si vous mettez à jour une vue dans un projet autre que votre projet par défaut, ajoutez l'ID du projet au nom de l'ensemble de données, en respectant le format suivant : project_id:dataset.

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

Où :

  • path_to_file est le chemin de l'URI ou du système de fichiers local permettant d'accéder à un fichier de code, qui doit être chargé et évalué immédiatement en tant que ressource de fonction définie par l'utilisateur utilisée par la vue. Répétez l'option pour spécifier plusieurs fichiers.
  • query est une requête SQL standard valide.
  • project_id est l'ID de votre projet.
  • dataset est un ensemble de données contenant la vue.
  • view est le nom de la vue que vous souhaitez mettre à jour.

Par exemple :

Saisissez la commande suivante pour mettre à jour la requête SQL pour une vue nommée myview dans mydataset. mydataset se trouve dans votre projet par défaut. L'exemple de requête utilisé pour mettre à jour la vue interroge les données de l'ensemble de données public Données sur les noms aux États-Unis.

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

Saisissez la commande suivante pour mettre à jour la requête SQL pour une vue nommée myview dans mydataset. mydataset se trouve dans myotherproject, et non dans votre projet par défaut. L'exemple de requête utilisé pour mettre à jour la vue interroge les données de l'ensemble de données public Données sur les noms aux États-Unis.

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

Pour mettre à jour une vue, appelez la méthode tables.patch avec une ressource de table contenant une propriété view mise à jour. Étant donné que la méthode tables.update remplace l'intégralité de la ressource de table, la méthode tables.patch est préférable.

Go

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Go décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Go.

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

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Java décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage 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

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Node.js décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Node.js.

// 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();

  // Uodate view query
  metadata.view = newViewQuery;

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

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

Python

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Python décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery Python.

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)}")

Mettre à jour le délai d'expiration d'une vue

Vous pouvez définir un délai d'expiration par défaut des tables au niveau de l'ensemble de données (qui affecte à la fois les tables et les vues). Vous pouvez également définir le délai d'expiration d'une vue au moment de sa création, auquel cas le délai d'expiration par défaut des tables de l'ensemble de données est ignoré. Si vous ne définissez de délai d'expiration dans aucun de ces deux cas, la vue n'expire jamais et vous devez la supprimer manuellement.

À tout moment après la création de la vue, vous pouvez mettre à jour son délai d'expiration de plusieurs façons :

  • Exécuter la commande bq update de l'outil de ligne de commande bq
  • En appelant la méthode API tables.patch
  • En utilisant les bibliothèques clientes

Pour mettre à jour le délai d'expiration d'une vue :

Console

  1. Dans le volet de navigation, sélectionnez la vue.

  2. Sur la page Détails de la vue, cliquez sur Détails.

  3. À droite de la boîte de dialogue Informations sur la vue, cliquez sur l'icône de modification (le crayon).

  4. Dans la boîte de dialogue Informations sur la vue, cliquez sur Spécifier une date dans la section Expiration de la vue.

  5. Dans le sélecteur de date, saisissez la date et l'heure d'expiration, puis cliquez sur OK.

  6. Cliquez sur Mettre à jour. Le délai d'expiration mis à jour apparaît dans la section Informations sur la vue.

SQL

Les instructions LDD (langage de définition de données) vous permettent de créer et de modifier des tables et des vues à l'aide de la syntaxe de requête SQL standard.

En savoir plus sur l'utilisation des instructions de langage de définition de données

Pour utiliser une instruction LDD dans Cloud Console, procédez comme suit :

  1. Cliquez sur Saisir une nouvelle requête.

  2. Saisissez votre instruction LDD dans la zone de texte Query editor (Éditeur de requête).

    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. Cliquez sur Exécuter la requête.

bq

Exécutez la commande bq update avec l'option --expiration. Si vous mettez à jour une vue dans un projet autre que votre projet par défaut, ajoutez l'ID du projet au nom de l'ensemble de données, en respectant le format suivant : project_id:dataset.

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

Où :

  • integer est la durée de vie par défaut (en secondes) de la table. La valeur minimale est de 3 600 secondes (une heure). Le délai d'expiration correspond à l'heure actuelle plus la valeur entière.
  • project_id est l'ID de votre projet.
  • dataset est le nom de l'ensemble de données contenant la vue que vous mettez à jour.
  • view est le nom de la vue que vous mettez à jour.

Exemples :

Saisissez la commande suivante pour faire passer le délai d'expiration de myview dans mydataset à cinq jours (432 000 secondes). mydataset se trouve dans votre projet par défaut.

bq update --expiration 432000 mydataset.myview

Saisissez la commande suivante pour faire passer le délai d'expiration de myview dans mydataset à cinq jours (432 000 secondes). mydataset se trouve dans myotherproject, et non dans votre projet par défaut.

bq update --expiration 432000 myotherproject:mydataset.myview

API

Appelez la méthode tables.patch, puis utilisez la propriété expirationTime de la ressource de table. Étant donné que la méthode tables.update remplace l'intégralité de la ressource de table, la méthode tables.patch est préférable. Lorsque vous utilisez l'API REST, le délai d'expiration de la vue est exprimé en millisecondes.

Go

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Go décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Go.

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

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Java décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage 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

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Node.js décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Node.js.

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

Pour mettre à jour le délai d'expiration d'une vue, vous devez suivre la même procédure que pour mettre à jour celui d'une table.

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Python décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery Python.

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

Mettre à jour la description d'une vue

Vous pouvez mettre à jour la description d'une vue de plusieurs façons :

  • Utiliser Cloud Console
  • Exécuter la commande bq update de l'outil de ligne de commande bq
  • En appelant la méthode API tables.patch
  • En utilisant les bibliothèques clientes

Pour mettre à jour la description d'une vue :

Console

Vous ne pouvez pas ajouter de description lorsque vous créez une vue à l'aide de Cloud Console. Une fois la vue créée, vous pouvez ajouter une description sur la page Details (Détails).

  1. Dans le panneau Explorateur, développez votre projet et votre ensemble de données, puis sélectionnez la vue.

  2. Cliquez sur l'onglet Détails.

  3. Cliquez sur l'icône en forme de crayon à côté de Description.

    Modifier la description de la vue

  4. Saisissez une description dans la boîte de dialogue. Cliquez sur Mettre à jour pour enregistrer la nouvelle description.

SQL

Les instructions LDD (langage de définition de données) vous permettent de créer et de modifier des tables et des vues à l'aide de la syntaxe de requête SQL standard.

En savoir plus sur l'utilisation des instructions de langage de définition de données

Pour utiliser une instruction LDD dans Cloud Console, procédez comme suit :

  1. Cliquez sur Saisir une nouvelle requête.

  2. Saisissez votre instruction LDD dans la zone de texte Query editor (Éditeur de requête).

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

  3. Cliquez sur Exécuter la requête.

bq

Exécutez la commande bq update avec l'option --description. Si vous mettez à jour une vue dans un projet autre que votre projet par défaut, ajoutez l'ID du projet au nom de l'ensemble de données, en respectant le format suivant : [PROJECT_ID]:[DATASET].

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

Où :

  • description est le texte décrivant la vue, entre guillemets.
  • project_id est l'ID de votre projet.
  • dataset est le nom de l'ensemble de données contenant la vue que vous mettez à jour.
  • view est le nom de la vue que vous mettez à jour.

Exemples :

Saisissez la commande suivante pour remplacer la description de myview dans mydataset par "Description of myview". mydataset se trouve dans votre projet par défaut.

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

Saisissez la commande suivante pour remplacer la description de myview dans mydataset par "Description of myview". mydataset se trouve dans myotherproject, et non dans votre projet par défaut.

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

API

Appelez la méthode tables.patch, puis utilisez la propriété description pour mettre à jour la description de la vue dans la ressource de table. Étant donné que la méthode tables.update remplace l'intégralité de la ressource de table, la méthode tables.patch est préférable.

Go

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Go décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Go.

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

Pour mettre à jour la description d'une vue, vous devez suivre la même procédure que pour mettre à jour celle d'une table.

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Java décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage 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

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Node.js décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Node.js.

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

Pour mettre à jour la description d'une vue, vous devez suivre la même procédure que pour mettre à jour celle d'une table.

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Python décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery Python.

# 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."

Étapes suivantes