Criar tabelas particionadas

Esta página descreve como criar tabelas particionadas no BigQuery. Para uma vista geral das tabelas particionadas, consulte o artigo Introdução às tabelas particionadas.

Antes de começar

Conceda funções de gestão de identidade e acesso (IAM) que dão aos utilizadores as autorizações necessárias para realizar cada tarefa neste documento.

Autorizações necessárias

Funções necessárias

Para receber as autorizações de que precisa para criar uma tabela, peça ao seu administrador que lhe conceda as seguintes funções do IAM:

Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Estas funções predefinidas contêm as autorizações necessárias para criar uma tabela. Para ver as autorizações exatas que são necessárias, expanda a secção Autorizações necessárias:

Autorizações necessárias

São necessárias as seguintes autorizações para criar uma tabela:

  • bigquery.tables.create no conjunto de dados onde está a criar a tabela.
  • bigquery.tables.getData em todas as tabelas e vistas a que a sua consulta faz referência se estiver a guardar os resultados da consulta como uma tabela.
  • bigquery.jobs.create no projeto, se estiver a criar a tabela carregando dados ou guardando resultados de consultas numa tabela.
  • bigquery.tables.updateData na tabela se estiver a anexar ou substituir uma tabela com resultados da consulta.

Também pode conseguir estas autorizações com funções personalizadas ou outras funções predefinidas.

Crie uma tabela particionada vazia

Os passos para criar uma tabela particionada no BigQuery são semelhantes aos da criação de uma tabela padrão, exceto que especifica as opções de particionamento, juntamente com quaisquer outras opções de tabela.

Crie uma tabela particionada por colunas de unidades de tempo

Para criar uma tabela particionada por colunas de unidade de tempo vazia com uma definição de esquema:

Consola

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No painel Explorador, expanda o seu projeto e, de seguida, selecione um conjunto de dados.
  3. Na secção Informações do conjunto de dados, clique em Criar tabela.
  4. No painel Criar tabela, especifique os seguintes detalhes:
    1. Na secção Origem, selecione Tabela vazia na lista Criar tabela a partir de.
    2. Na secção Destino, especifique os seguintes detalhes:
      1. Para Conjunto de dados, selecione o conjunto de dados no qual quer criar a tabela.
      2. No campo Tabela, introduza o nome da tabela que quer criar.
      3. Verifique se o campo Tipo de tabela está definido como Tabela nativa.
    3. Na secção Esquema, introduza a definição do esquema. O esquema tem de incluir uma coluna DATE, TIMESTAMP ou DATETIME para a coluna de partição. Para mais informações, consulte a secção Especificar um esquema. Pode introduzir manualmente informações do esquema através de um dos seguintes métodos:
      • Opção 1: clique em Editar como texto e cole o esquema sob a forma de uma matriz JSON. Quando usa uma matriz JSON, gera o esquema através do mesmo processo que criar um ficheiro de esquema JSON. Pode ver o esquema de uma tabela existente no formato JSON introduzindo o seguinte comando:
            bq show --format=prettyjson dataset.table
            
      • Opção 2: clique em Adicionar campo e introduza o esquema da tabela. Especifique o Nome, Tipo e Modo de cada campo.
    4. Na secção Definições de partição e cluster, na lista Partição, selecione Particionar por campo e, de seguida, escolha a coluna de partição. Esta opção só está disponível se o esquema contiver uma coluna DATE, TIMESTAMP ou DATETIME.
    5. Opcional: para exigir um filtro de partição em todas as consultas para esta tabela, selecione a caixa de verificação Exigir filtro de partição. Um filtro de partição pode reduzir o custo e melhorar o desempenho. Para mais informações, consulte o artigo Defina os requisitos do filtro de partição.
    6. Selecione o Tipo de partição. Apenas é suportado o agrupamento Por dia.
    7. Opcional: na secção Opções avançadas, se quiser usar uma chave de encriptação gerida pelo cliente, selecione a opção Usar uma chave de encriptação gerida pelo cliente (CMEK). Por predefinição, o BigQuery encripta o conteúdo do cliente armazenado em repouso através de um Google Cloud-powered encryption key.
    8. Clique em Criar tabela.

SQL

Para criar uma tabela particionada por colunas de unidade de tempo, use a CREATE TABLE declaração DDL com uma PARTITION BY cláusula.

O exemplo seguinte cria uma tabela com partições diárias com base na coluna transaction_date:

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, introduza a seguinte declaração:

    CREATE TABLE
      mydataset.newtable (transaction_id INT64, transaction_date DATE)
    PARTITION BY
      transaction_date
      OPTIONS (
        partition_expiration_days = 3,
        require_partition_filter = TRUE);

    Use a cláusula OPTIONS para definir opções de tabelas, como a expiração da partição e os requisitos do filtro de partição.

  3. Clique em Executar.

Para mais informações sobre como executar consultas, consulte o artigo Execute uma consulta interativa.

O tipo de partição predefinido para colunas DATE é a partição diária. Para especificar um tipo de partição diferente, inclua a função DATE_TRUNC na cláusula PARTITION BY. Por exemplo, a seguinte consulta cria uma tabela com partições mensais:

CREATE TABLE
  mydataset.newtable (transaction_id INT64, transaction_date DATE)
PARTITION BY
  DATE_TRUNC(transaction_date, MONTH)
  OPTIONS (
    partition_expiration_days = 3,
    require_partition_filter = TRUE);

Também pode especificar uma coluna TIMESTAMP ou DATETIME como a coluna de partição. Nesse caso, inclua a função TIMESTAMP_TRUNC ou DATETIME_TRUNC na cláusula PARTITION BY para especificar o tipo de partição. Por exemplo, a seguinte declaração cria uma tabela com partições diárias com base numa coluna TIMESTAMP:

CREATE TABLE
  mydataset.newtable (transaction_id INT64, transaction_ts TIMESTAMP)
PARTITION BY
  TIMESTAMP_TRUNC(transaction_ts, DAY)
  OPTIONS (
    partition_expiration_days = 3,
    require_partition_filter = TRUE);

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Use o comando bq mk com a flag --table (ou o atalho -t):

    bq mk \
       --table \
       --schema SCHEMA \
       --time_partitioning_field COLUMN \
       --time_partitioning_type UNIT_TIME \
       --time_partitioning_expiration EXPIRATION_TIME \
       --require_partition_filter=BOOLEAN
       PROJECT_ID:DATASET.TABLE

    Substitua o seguinte:

    • SCHEMA: uma definição de esquema no formato column:data_type,column:data_type ou o caminho para um ficheiro de esquema JSON no seu computador local. Para mais informações, consulte o artigo Especificar um esquema.
    • COLUMN: o nome da coluna de partição. No esquema da tabela, esta coluna tem de ser do tipo TIMESTAMP, DATETIME ou DATE.
    • UNIT_TIME: o tipo de partição. Os valores suportados incluem DAY, HOUR, MONTH ou YEAR.
    • EXPIRATION_TIME: o tempo de validade das partições da tabela, em segundos. A flag --time_partitioning_expiration é opcional. Para mais informações, consulte o artigo Defina o prazo de validade da partição.
    • BOOLEAN: se true, as consultas nesta tabela têm de incluir um filtro de partição. A flag --require_partition_filter é opcional. Para mais informações, consulte o artigo Defina os requisitos de filtro de partição.
    • PROJECT_ID: o ID do projeto. Se for omitido, é usado o seu projeto predefinido.
    • DATASET: o nome de um conjunto de dados no seu projeto.
    • TABLE: o nome da tabela a criar.

    Para outras opções de linha de comandos, consulte bq mk.

    O exemplo seguinte cria uma tabela denominada mytable que é particionada na coluna ts, usando a partição por hora. A validade da partição é de 259 200 segundos (3 dias).

    bq mk \
       -t \
       --schema 'ts:TIMESTAMP,qtr:STRING,sales:FLOAT' \
       --time_partitioning_field ts \
       --time_partitioning_type HOUR \
       --time_partitioning_expiration 259200  \
       mydataset.mytable
  3. Terraform

    Use o recurso google_bigquery_table.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    O exemplo seguinte cria uma tabela denominada mytable que é particionada por dia:

    resource "google_bigquery_dataset" "default" {
      dataset_id                      = "mydataset"
      default_partition_expiration_ms = 2592000000  # 30 days
      default_table_expiration_ms     = 31536000000 # 365 days
      description                     = "dataset description"
      location                        = "US"
      max_time_travel_hours           = 96 # 4 days
    
      labels = {
        billing_group = "accounting",
        pii           = "sensitive"
      }
    }
    
    resource "google_bigquery_table" "default" {
      dataset_id          = google_bigquery_dataset.default.dataset_id
      table_id            = "mytable"
      deletion_protection = false # set to "true" in production
    
      time_partitioning {
        type          = "DAY"
        field         = "Created"
        expiration_ms = 432000000 # 5 days
      }
      require_partition_filter = true
    
      schema = <<EOF
    [
      {
        "name": "ID",
        "type": "INT64",
        "mode": "NULLABLE",
        "description": "Item ID"
      },
      {
        "name": "Created",
        "type": "TIMESTAMP",
        "description": "Record creation timestamp"
      },
      {
        "name": "Item",
        "type": "STRING",
        "mode": "NULLABLE"
      }
    ]
    EOF
    
    }

    Para aplicar a configuração do Terraform num Trusted Cloud projeto, conclua os passos nas secções seguintes.

    Prepare o Cloud Shell

    1. Inicie o Cloud Shell.
    2. Defina o Trusted Cloud projeto predefinido onde quer aplicar as suas configurações do Terraform.

      Só tem de executar este comando uma vez por projeto e pode executá-lo em qualquer diretório.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      As variáveis de ambiente são substituídas se definir valores explícitos no ficheiro de configuração do Terraform.

    Prepare o diretório

    Cada ficheiro de configuração do Terraform tem de ter o seu próprio diretório (também denominado módulo raiz).

    1. No Cloud Shell, crie um diretório e um novo ficheiro nesse diretório. O nome do ficheiro tem de ter a extensão .tf, por exemplo, main.tf. Neste tutorial, o ficheiro é denominado main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Se estiver a seguir um tutorial, pode copiar o código de exemplo em cada secção ou passo.

      Copie o exemplo de código para o ficheiro main.tf criado recentemente.

      Opcionalmente, copie o código do GitHub. Isto é recomendado quando o fragmento do Terraform faz parte de uma solução completa.

    3. Reveja e modifique os parâmetros de exemplo para aplicar ao seu ambiente.
    4. Guarde as alterações.
    5. Inicialize o Terraform. Só tem de fazer isto uma vez por diretório.
      terraform init

      Opcionalmente, para usar a versão mais recente do fornecedor Google, inclua a opção -upgrade:

      terraform init -upgrade

    Aplique as alterações

    1. Reveja a configuração e verifique se os recursos que o Terraform vai criar ou atualizar correspondem às suas expetativas:
      terraform plan

      Faça as correções necessárias à configuração.

    2. Aplique a configuração do Terraform executando o seguinte comando e introduzindo yes no comando:
      terraform apply

      Aguarde até que o Terraform apresente a mensagem "Apply complete!" (Aplicação concluída!).

    3. Abra o seu Trusted Cloud projeto para ver os resultados. Na Trusted Cloud consola, navegue para os seus recursos na IU para se certificar de que o Terraform os criou ou atualizou.

    API

    Chame o método tables.insert com um recurso de tabela definido que especifique a propriedade timePartitioning e a propriedade schema.

    Go

    Antes de experimentar este exemplo, siga as Goinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Go BigQuery documentação de referência.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

    import (
    	"context"
    	"fmt"
    	"time"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // createTablePartitioned demonstrates creating a table and specifying a time partitioning configuration.
    func createTablePartitioned(projectID, datasetID, tableID string) error {
    	// projectID := "my-project-id"
    	// datasetID := "mydatasetid"
    	// tableID := "mytableid"
    	ctx := context.Background()
    
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	sampleSchema := bigquery.Schema{
    		{Name: "name", Type: bigquery.StringFieldType},
    		{Name: "post_abbr", Type: bigquery.IntegerFieldType},
    		{Name: "date", Type: bigquery.DateFieldType},
    	}
    	metadata := &bigquery.TableMetadata{
    		TimePartitioning: &bigquery.TimePartitioning{
    			Field:      "date",
    			Expiration: 90 * 24 * time.Hour,
    		},
    		Schema: sampleSchema,
    	}
    	tableRef := client.Dataset(datasetID).Table(tableID)
    	if err := tableRef.Create(ctx, metadata); err != nil {
    		return err
    	}
    	return nil
    }
    

    Java

    Antes de experimentar este exemplo, siga as Javainstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Java BigQuery documentação de referência.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Field;
    import com.google.cloud.bigquery.Schema;
    import com.google.cloud.bigquery.StandardSQLTypeName;
    import com.google.cloud.bigquery.StandardTableDefinition;
    import com.google.cloud.bigquery.TableId;
    import com.google.cloud.bigquery.TableInfo;
    import com.google.cloud.bigquery.TimePartitioning;
    
    // Sample to create a partition table
    public class CreatePartitionedTable {
    
      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";
        Schema schema =
            Schema.of(
                Field.of("name", StandardSQLTypeName.STRING),
                Field.of("post_abbr", StandardSQLTypeName.STRING),
                Field.of("date", StandardSQLTypeName.DATE));
        createPartitionedTable(datasetName, tableName, schema);
      }
    
      public static void createPartitionedTable(String datasetName, String tableName, Schema schema) {
        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);
    
          TimePartitioning partitioning =
              TimePartitioning.newBuilder(TimePartitioning.Type.DAY)
                  .setField("date") //  name of column to use for partitioning
                  .setExpirationMs(7776000000L) // 90 days
                  .build();
    
          StandardTableDefinition tableDefinition =
              StandardTableDefinition.newBuilder()
                  .setSchema(schema)
                  .setTimePartitioning(partitioning)
                  .build();
          TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();
    
          bigquery.create(tableInfo);
          System.out.println("Partitioned table created successfully");
        } catch (BigQueryException e) {
          System.out.println("Partitioned table was not created. \n" + e.toString());
        }
      }
    }

    Node.js

    Antes de experimentar este exemplo, siga as Node.jsinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Node.js BigQuery documentação de referência.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function createTablePartitioned() {
      // Creates a new partitioned table named "my_table" in "my_dataset".
    
      /**
       * TODO(developer): Uncomment the following lines before running the sample.
       */
      // const datasetId = "my_dataset";
      // const tableId = "my_table";
      const schema = 'Name:string, Post_Abbr:string, Date:date';
    
      // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
      const options = {
        schema: schema,
        location: 'US',
        timePartitioning: {
          type: 'DAY',
          expirationMS: '7776000000',
          field: 'date',
        },
      };
    
      // Create a new table in the dataset
      const [table] = await bigquery
        .dataset(datasetId)
        .createTable(tableId, options);
      console.log(`Table ${table.id} created with partitioning: `);
      console.log(table.metadata.timePartitioning);
    }

    Python

    Antes de experimentar este exemplo, siga as Pythoninstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Python BigQuery documentação de referência.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

    from google.cloud import bigquery
    
    client = bigquery.Client()
    
    # Use format "your-project.your_dataset.your_table_name" for table_id
    table_id = your_fully_qualified_table_id
    schema = [
        bigquery.SchemaField("name", "STRING"),
        bigquery.SchemaField("post_abbr", "STRING"),
        bigquery.SchemaField("date", "DATE"),
    ]
    table = bigquery.Table(table_id, schema=schema)
    table.time_partitioning = bigquery.TimePartitioning(
        type_=bigquery.TimePartitioningType.DAY,
        field="date",  # name of column to use for partitioning
        expiration_ms=1000 * 60 * 60 * 24 * 90,
    )  # 90 days
    
    table = client.create_table(table)
    
    print(
        f"Created table {table.project}.{table.dataset_id}.{table.table_id}, "
        f"partitioned on column {table.time_partitioning.field}."
    )

Crie uma tabela particionada por tempo de ingestão

Para criar uma tabela particionada por tempo de ingestão vazia com uma definição de esquema:

Consola

  1. Abra a página do BigQuery na Trusted Cloud consola.

    Aceda à página do BigQuery

  2. No painel Explorador, expanda o projeto e selecione um conjunto de dados.

  3. Expanda a opção Ações e clique em Abrir.

  4. No painel de detalhes, clique em Criar tabela .

  5. Na página Criar tabela, na secção Origem, selecione Tabela vazia.

  6. Na secção Destino:

    • Em Nome do conjunto de dados, escolha o conjunto de dados adequado.
    • No campo Nome da tabela, introduza o nome da tabela.
    • Verifique se o Tipo de tabela está definido como Tabela nativa.
  7. Na secção Esquema, introduza a definição do esquema.

  8. Na secção Definições de partição e cluster, para Partição, clique em Particionar por hora de carregamento.

  9. (Opcional) Para exigir um filtro de partição em todas as consultas para esta tabela, selecione a caixa de verificação Exigir filtro de partição. A exigência de um filtro de partição pode reduzir o custo e melhorar o desempenho. Para mais informações, consulte o artigo Defina os requisitos de filtro de partição.

  10. Clique em Criar tabela.

SQL

Para criar uma tabela particionada por tempo de ingestão, use a declaração CREATE TABLE com uma cláusula PARTITION BY que faz a partição em _PARTITIONDATE.

O exemplo seguinte cria uma tabela com partições diárias:

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, introduza a seguinte declaração:

    CREATE TABLE
      mydataset.newtable (transaction_id INT64)
    PARTITION BY
      _PARTITIONDATE
      OPTIONS (
        partition_expiration_days = 3,
        require_partition_filter = TRUE);

    Use a cláusula OPTIONS para definir opções de tabelas, como a expiração da partição e os requisitos do filtro de partição.

  3. Clique em Executar.

Para mais informações sobre como executar consultas, consulte o artigo Execute uma consulta interativa.

O tipo de particionamento predefinido para o particionamento por tempo de ingestão é o particionamento diário. Para especificar um tipo de partição diferente, inclua a função DATE_TRUNC na cláusula PARTITION BY. Por exemplo, a seguinte consulta cria uma tabela com partições mensais:

CREATE TABLE
  mydataset.newtable (transaction_id INT64)
PARTITION BY
  DATE_TRUNC(_PARTITIONTIME, MONTH)
  OPTIONS (
    partition_expiration_days = 3,
    require_partition_filter = TRUE);

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Use o comando bq mk com a flag --table (ou o atalho -t):

    bq mk \
       --table \
       --schema SCHEMA \
       --time_partitioning_type UNIT_TIME \
       --time_partitioning_expiration EXPIRATION_TIME \
       --require_partition_filter=BOOLEAN  \
       PROJECT_ID:DATASET.TABLE

    Substitua o seguinte:

    • SCHEMA: uma definição no formato column:data_type,column:data_type ou o caminho para um ficheiro de esquema JSON no seu computador local. Para mais informações, consulte o artigo Especificar um esquema.
    • UNIT_TIME: o tipo de partição. Os valores suportados incluem DAY, HOUR, MONTH ou YEAR.
    • EXPIRATION_TIME: o tempo de validade das partições da tabela, em segundos. A flag --time_partitioning_expiration é opcional. Para mais informações, consulte o artigo Defina o prazo de validade da partição.
    • BOOLEAN: se true, as consultas nesta tabela têm de incluir um filtro de partição. A flag --require_partition_filter é opcional. Para mais informações, consulte o artigo Defina os requisitos de filtro de partição.
    • PROJECT_ID: o ID do projeto. Se for omitido, é usado o seu projeto predefinido.
    • DATASET: o nome de um conjunto de dados no seu projeto.
    • TABLE: o nome da tabela a criar.

    Para outras opções de linha de comandos, consulte bq mk.

    O exemplo seguinte cria uma tabela particionada por tempo de ingestão denominada mytable. A tabela tem uma partição diária, com um prazo de validade da partição de 259 200 segundos (3 dias).

    bq mk \
       -t \
       --schema qtr:STRING,sales:FLOAT,year:STRING \
       --time_partitioning_type DAY \
       --time_partitioning_expiration 259200 \
       mydataset.mytable
  3. Terraform

    Use o recurso google_bigquery_table.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    O exemplo seguinte cria uma tabela denominada mytable que é particionada por tempo de ingestão:

    resource "google_bigquery_dataset" "default" {
      dataset_id                      = "mydataset"
      default_partition_expiration_ms = 2592000000  # 30 days
      default_table_expiration_ms     = 31536000000 # 365 days
      description                     = "dataset description"
      location                        = "US"
      max_time_travel_hours           = 96 # 4 days
    
      labels = {
        billing_group = "accounting",
        pii           = "sensitive"
      }
    }
    
    resource "google_bigquery_table" "default" {
      dataset_id          = google_bigquery_dataset.default.dataset_id
      table_id            = "mytable"
      deletion_protection = false # set to "true" in production
    
      time_partitioning {
        type          = "MONTH"
        expiration_ms = 604800000 # 7 days
      }
      require_partition_filter = true
    
      schema = <<EOF
    [
      {
        "name": "ID",
        "type": "INT64",
        "mode": "NULLABLE",
        "description": "Item ID"
      },
      {
        "name": "Item",
        "type": "STRING",
        "mode": "NULLABLE"
      }
    ]
    EOF
    
    }

    Para aplicar a configuração do Terraform num Trusted Cloud projeto, conclua os passos nas secções seguintes.

    Prepare o Cloud Shell

    1. Inicie o Cloud Shell.
    2. Defina o Trusted Cloud projeto predefinido onde quer aplicar as suas configurações do Terraform.

      Só tem de executar este comando uma vez por projeto e pode executá-lo em qualquer diretório.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      As variáveis de ambiente são substituídas se definir valores explícitos no ficheiro de configuração do Terraform.

    Prepare o diretório

    Cada ficheiro de configuração do Terraform tem de ter o seu próprio diretório (também denominado módulo raiz).

    1. No Cloud Shell, crie um diretório e um novo ficheiro nesse diretório. O nome do ficheiro tem de ter a extensão .tf, por exemplo, main.tf. Neste tutorial, o ficheiro é denominado main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Se estiver a seguir um tutorial, pode copiar o código de exemplo em cada secção ou passo.

      Copie o exemplo de código para o ficheiro main.tf criado recentemente.

      Opcionalmente, copie o código do GitHub. Isto é recomendado quando o fragmento do Terraform faz parte de uma solução completa.

    3. Reveja e modifique os parâmetros de exemplo para aplicar ao seu ambiente.
    4. Guarde as alterações.
    5. Inicialize o Terraform. Só tem de fazer isto uma vez por diretório.
      terraform init

      Opcionalmente, para usar a versão mais recente do fornecedor Google, inclua a opção -upgrade:

      terraform init -upgrade

    Aplique as alterações

    1. Reveja a configuração e verifique se os recursos que o Terraform vai criar ou atualizar correspondem às suas expetativas:
      terraform plan

      Faça as correções necessárias à configuração.

    2. Aplique a configuração do Terraform executando o seguinte comando e introduzindo yes no comando:
      terraform apply

      Aguarde até que o Terraform apresente a mensagem "Apply complete!" (Aplicação concluída!).

    3. Abra o seu Trusted Cloud projeto para ver os resultados. Na Trusted Cloud consola, navegue para os seus recursos na IU para se certificar de que o Terraform os criou ou atualizou.

    API

    Chame o método tables.insert com um recurso de tabela definido que especifique a propriedade timePartitioning e a propriedade schema.

Crie uma tabela particionada por intervalo de números inteiros

Para criar uma tabela particionada por intervalo de números inteiros vazia com uma definição de esquema:

Consola

  1. Abra a página do BigQuery na Trusted Cloud consola.

    Aceda à página do BigQuery

  2. No painel Explorador, expanda o projeto e selecione um conjunto de dados.

  3. Expanda a opção Ações e clique em Abrir.

  4. No painel de detalhes, clique em Criar tabela .

  5. Na página Criar tabela, na secção Origem, selecione Tabela vazia.

  6. Na secção Destino:

    • Em Nome do conjunto de dados, escolha o conjunto de dados adequado.
    • No campo Nome da tabela, introduza o nome da tabela.
    • Verifique se o Tipo de tabela está definido como Tabela nativa.
  7. Na secção Esquema, introduza a definição do esquema. Certifique-se de que o esquema inclui uma coluna INTEGER para a coluna de partição. Para mais informações, consulte Especificar um esquema.

  8. Na secção Definições de partição e agrupamento, na lista pendente Partição, selecione Particionar por campo e escolha a coluna de partição. Esta opção só está disponível se o esquema contiver uma coluna INTEGER.

  9. Forneça valores para Início, Fim e Intervalo:

    • Start é o início do primeiro intervalo de partições (inclusive).
    • End é o fim do intervalo da última partição (exclusivo).
    • O intervalo é a largura de cada intervalo de partição.

    Os valores fora destes intervalos são colocados numa __UNPARTITIONED__partição especial.

  10. (Opcional) Para exigir um filtro de partição em todas as consultas para esta tabela, selecione a caixa de verificação Exigir filtro de partição. A exigência de um filtro de partição pode reduzir o custo e melhorar o desempenho. Para mais informações, consulte o artigo Defina os requisitos de filtro de partição.

  11. Clique em Criar tabela.

SQL

Para criar uma tabela particionada por intervalo de números inteiros, use a declaração DDL CREATE TABLE com uma cláusula PARTITION BY.

O exemplo seguinte cria uma tabela particionada na coluna customer_id com início 0, fim 100 e intervalo 10:

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, introduza a seguinte declaração:

    CREATE TABLE mydataset.newtable (customer_id INT64, date1 DATE)
    PARTITION BY
      RANGE_BUCKET(customer_id, GENERATE_ARRAY(0, 100, 10))
      OPTIONS (
        require_partition_filter = TRUE);

    Use a cláusula OPTIONS para definir opções de tabela, como os requisitos de filtro de partição.

  3. Clique em Executar.

Para mais informações sobre como executar consultas, consulte o artigo Execute uma consulta interativa.

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Use o comando bq mk com a flag --table (ou o atalho -t):

    bq mk \
       --schema schema \
       --range_partitioning=COLUMN_NAME,START,END,INTERVAL \
       --require_partition_filter=BOOLEAN  \
       PROJECT_ID:DATASET.TABLE

    Substitua o seguinte:

    • SCHEMA: Uma definição de esquema inline no formato column:data_type,column:data_type ou o caminho para um ficheiro de esquema JSON no seu computador local. Para mais informações, consulte o artigo Especificar um esquema.
    • COLUMN_NAME: o nome da coluna de partição. No esquema da tabela, esta coluna tem de ser do tipo INTEGER.
    • START: o início do primeiro intervalo de partições (inclusive).
    • END: o fim do último intervalo de partição (exclusivo).
    • INTERVAL: a largura de cada intervalo de partição.
    • BOOLEAN: se true, as consultas nesta tabela têm de incluir um filtro de partição. A flag --require_partition_filter é opcional. Para mais informações, consulte o artigo Defina os requisitos de filtro de partição.
    • PROJECT_ID: o ID do projeto. Se for omitido, é usado o seu projeto predefinido.
    • DATASET: o nome de um conjunto de dados no seu projeto.
    • TABLE: o nome da tabela a criar.

    Os valores fora do intervalo da partição são colocados numa partição especial __UNPARTITIONED__.

    Para outras opções de linha de comandos, consulte bq mk.

    O exemplo seguinte cria uma tabela denominada mytable que é particionada na coluna customer_id.

    bq mk \
       -t \
       --schema 'customer_id:INTEGER,qtr:STRING,sales:FLOAT' \
       --range_partitioning=customer_id,0,100,10 \
       mydataset.mytable
  3. Terraform

    Use o recurso google_bigquery_table.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    O exemplo seguinte cria uma tabela denominada mytable que é particionada por intervalo de números inteiros:

    resource "google_bigquery_dataset" "default" {
      dataset_id                      = "mydataset"
      default_partition_expiration_ms = 2592000000  # 30 days
      default_table_expiration_ms     = 31536000000 # 365 days
      description                     = "dataset description"
      location                        = "US"
      max_time_travel_hours           = 96 # 4 days
    
      labels = {
        billing_group = "accounting",
        pii           = "sensitive"
      }
    }
    
    resource "google_bigquery_table" "default" {
      dataset_id          = google_bigquery_dataset.default.dataset_id
      table_id            = "mytable"
      deletion_protection = false # set to "true" in production
    
      range_partitioning {
        field = "ID"
        range {
          start    = 0
          end      = 1000
          interval = 10
        }
      }
      require_partition_filter = true
    
      schema = <<EOF
    [
      {
        "name": "ID",
        "type": "INT64",
        "description": "Item ID"
      },
      {
        "name": "Item",
        "type": "STRING",
        "mode": "NULLABLE"
      }
    ]
    EOF
    
    }

    Para aplicar a configuração do Terraform num Trusted Cloud projeto, conclua os passos nas secções seguintes.

    Prepare o Cloud Shell

    1. Inicie o Cloud Shell.
    2. Defina o Trusted Cloud projeto predefinido onde quer aplicar as suas configurações do Terraform.

      Só tem de executar este comando uma vez por projeto e pode executá-lo em qualquer diretório.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      As variáveis de ambiente são substituídas se definir valores explícitos no ficheiro de configuração do Terraform.

    Prepare o diretório

    Cada ficheiro de configuração do Terraform tem de ter o seu próprio diretório (também denominado módulo raiz).

    1. No Cloud Shell, crie um diretório e um novo ficheiro nesse diretório. O nome do ficheiro tem de ter a extensão .tf, por exemplo, main.tf. Neste tutorial, o ficheiro é denominado main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Se estiver a seguir um tutorial, pode copiar o código de exemplo em cada secção ou passo.

      Copie o exemplo de código para o ficheiro main.tf criado recentemente.

      Opcionalmente, copie o código do GitHub. Isto é recomendado quando o fragmento do Terraform faz parte de uma solução completa.

    3. Reveja e modifique os parâmetros de exemplo para aplicar ao seu ambiente.
    4. Guarde as alterações.
    5. Inicialize o Terraform. Só tem de fazer isto uma vez por diretório.
      terraform init

      Opcionalmente, para usar a versão mais recente do fornecedor Google, inclua a opção -upgrade:

      terraform init -upgrade

    Aplique as alterações

    1. Reveja a configuração e verifique se os recursos que o Terraform vai criar ou atualizar correspondem às suas expetativas:
      terraform plan

      Faça as correções necessárias à configuração.

    2. Aplique a configuração do Terraform executando o seguinte comando e introduzindo yes no comando:
      terraform apply

      Aguarde até que o Terraform apresente a mensagem "Apply complete!" (Aplicação concluída!).

    3. Abra o seu Trusted Cloud projeto para ver os resultados. Na Trusted Cloud consola, navegue para os seus recursos na IU para se certificar de que o Terraform os criou ou atualizou.

    API

    Chame o método tables.insert com um recurso de tabela definido que especifique a propriedade rangePartitioning e a propriedade schema.

    Java

    Antes de experimentar este exemplo, siga as Javainstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Java BigQuery documentação de referência.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Field;
    import com.google.cloud.bigquery.RangePartitioning;
    import com.google.cloud.bigquery.Schema;
    import com.google.cloud.bigquery.StandardSQLTypeName;
    import com.google.cloud.bigquery.StandardTableDefinition;
    import com.google.cloud.bigquery.TableId;
    import com.google.cloud.bigquery.TableInfo;
    
    // Sample to create a range partitioned table
    public class CreateRangePartitionedTable {
    
      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";
        Schema schema =
            Schema.of(
                Field.of("integerField", StandardSQLTypeName.INT64),
                Field.of("stringField", StandardSQLTypeName.STRING),
                Field.of("booleanField", StandardSQLTypeName.BOOL),
                Field.of("dateField", StandardSQLTypeName.DATE));
        createRangePartitionedTable(datasetName, tableName, schema);
      }
    
      public static void createRangePartitionedTable(
          String datasetName, String tableName, Schema schema) {
        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);
    
          // Note: The field must be a top- level, NULLABLE/REQUIRED field.
          // The only supported type is INTEGER/INT64
          RangePartitioning partitioning =
              RangePartitioning.newBuilder()
                  .setField("integerField")
                  .setRange(
                      RangePartitioning.Range.newBuilder()
                          .setStart(1L)
                          .setInterval(2L)
                          .setEnd(10L)
                          .build())
                  .build();
    
          StandardTableDefinition tableDefinition =
              StandardTableDefinition.newBuilder()
                  .setSchema(schema)
                  .setRangePartitioning(partitioning)
                  .build();
          TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();
    
          bigquery.create(tableInfo);
          System.out.println("Range partitioned table created successfully");
        } catch (BigQueryException e) {
          System.out.println("Range partitioned table was not created. \n" + e.toString());
        }
      }
    }

    Node.js

    Antes de experimentar este exemplo, siga as Node.jsinstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Node.js BigQuery documentação de referência.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function createTableRangePartitioned() {
      // Creates a new integer range partitioned table named "my_table"
      // in "my_dataset".
    
      /**
       * TODO(developer): Uncomment the following lines before running the sample.
       */
      // const datasetId = "my_dataset";
      // const tableId = "my_table";
    
      const schema = [
        {name: 'fullName', type: 'STRING'},
        {name: 'city', type: 'STRING'},
        {name: 'zipcode', type: 'INTEGER'},
      ];
    
      // To use integer range partitioning, select a top-level REQUIRED or
      // NULLABLE column with INTEGER / INT64 data type. Values that are
      // outside of the range of the table will go into the UNPARTITIONED
      // partition. Null values will be in the NULL partition.
      const rangePartition = {
        field: 'zipcode',
        range: {
          start: 0,
          end: 100000,
          interval: 10,
        },
      };
    
      // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
      const options = {
        schema: schema,
        rangePartitioning: rangePartition,
      };
    
      // Create a new table in the dataset
      const [table] = await bigquery
        .dataset(datasetId)
        .createTable(tableId, options);
    
      console.log(`Table ${table.id} created with integer range partitioning: `);
      console.log(table.metadata.rangePartitioning);
    }

    Python

    Antes de experimentar este exemplo, siga as Pythoninstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Python BigQuery documentação de referência.

    Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

    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 create.
    # table_id = "your-project.your_dataset.your_table_name"
    
    schema = [
        bigquery.SchemaField("full_name", "STRING"),
        bigquery.SchemaField("city", "STRING"),
        bigquery.SchemaField("zipcode", "INTEGER"),
    ]
    
    table = bigquery.Table(table_id, schema=schema)
    table.range_partitioning = bigquery.RangePartitioning(
        # To use integer range partitioning, select a top-level REQUIRED /
        # NULLABLE column with INTEGER / INT64 data type.
        field="zipcode",
        range_=bigquery.PartitionRange(start=0, end=100000, interval=10),
    )
    table = client.create_table(table)  # Make an API request.
    print(
        "Created table {}.{}.{}".format(table.project, table.dataset_id, table.table_id)
    )

Crie uma tabela particionada a partir do resultado de uma consulta

Pode criar uma tabela particionada a partir de um resultado de consulta das seguintes formas:

  • Em SQL, use uma declaração CREATE TABLE ... AS SELECT. Pode usar esta abordagem para criar uma tabela particionada por coluna de unidade de tempo ou intervalo de números inteiros, mas não por tempo de carregamento.
  • Use a ferramenta de linhas de comando bq ou a API BigQuery para definir uma tabela de destino para uma consulta. Quando a consulta é executada, o BigQuery escreve os resultados na tabela de destino. Pode usar esta abordagem para qualquer tipo de partição.
  • Chame o método da API jobs.insert e especifique a partição na propriedade timePartitioning ou na propriedade rangePartitioning.

SQL

Use a declaração CREATE TABLE. Inclua uma cláusula PARTITION BY para configurar a partição.

O exemplo seguinte cria uma tabela com partição na coluna transaction_date:

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, introduza a seguinte declaração:

    CREATE TABLE
      mydataset.newtable (transaction_id INT64, transaction_date DATE)
    PARTITION BY
      transaction_date
    AS (
      SELECT
        transaction_id, transaction_date
      FROM
        mydataset.mytable
    );

    Use a cláusula OPTIONS para definir opções de tabela, como os requisitos de filtro de partição.

  3. Clique em Executar.

Para mais informações sobre como executar consultas, consulte o artigo Execute uma consulta interativa.

bq

  1. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para criar uma tabela particionada a partir de uma consulta, use o comando bq query com a flag --destination_table e a flag --time_partitioning_type.

    Partição de colunas de unidades de tempo:

    bq query \
       --use_legacy_sql=false \
       --destination_table TABLE_NAME \
       --time_partitioning_field COLUMN \
       --time_partitioning_type UNIT_TIME \
       'QUERY_STATEMENT'

    Particionamento por tempo de ingestão:

    bq query \
       --use_legacy_sql=false \
       --destination_table TABLE_NAME \
       --time_partitioning_type UNIT_TIME \
       'QUERY_STATEMENT'

    Partição de intervalo de números inteiros:

    bq query \
       --use_legacy_sql=false \
       --destination_table PROJECT_ID:DATASET.TABLE \
       --range_partitioning COLUMN,START,END,INTERVAL \
       'QUERY_STATEMENT'

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto. Se for omitido, é usado o seu projeto predefinido.
    • DATASET: o nome de um conjunto de dados no seu projeto.
    • TABLE: o nome da tabela a criar.
    • COLUMN: o nome da coluna de partição.
    • UNIT_TIME: o tipo de partição. Os valores suportados incluem DAY, HOUR, MONTH ou YEAR.
    • START: o início da partição por intervalo, inclusive.
    • END: o fim da partição por intervalo, exclusivo.
    • INTERVAL: a largura de cada intervalo na partição.
    • QUERY_STATEMENT: a consulta usada para preencher a tabela.

    O exemplo seguinte cria uma tabela com partição na coluna transaction_date, usando a partição mensal.

    bq query \
       --use_legacy_sql=false \
       --destination_table mydataset.newtable \
       --time_partitioning_field transaction_date \
       --time_partitioning_type MONTH \
       'SELECT transaction_id, transaction_date FROM mydataset.mytable'

    O exemplo seguinte cria uma tabela com partição na coluna customer_id, usando a partição de intervalo de números inteiros.

    bq query \
       --use_legacy_sql=false \
       --destination_table mydataset.newtable \
       --range_partitioning customer_id,0,100,10 \
       'SELECT * FROM mydataset.ponies'

    Para tabelas particionadas por tempo de carregamento, também pode carregar dados para uma partição específica através de um decorador de partição. O exemplo seguinte cria uma nova tabela particionada por tempo de ingestão e carrega dados na partição 20180201 (1 de fevereiro de 2018):

    bq query \
       --use_legacy_sql=false  \
       --time_partitioning_type=DAY \
       --destination_table='newtable$20180201' \
       'SELECT * FROM mydataset.mytable'
  3. API

    Para guardar os resultados da consulta numa tabela particionada, chame o método jobs.insert. Configure uma tarefa de query. Especifique a tabela de destino no destinationTable. Especifique a partição na propriedade timePartitioning ou na propriedade rangePartitioning.

Converta tabelas divididas por datas em tabelas particionadas por tempo de ingestão

Se criou anteriormente tabelas divididas por datas, pode converter o conjunto completo de tabelas relacionadas numa única tabela particionada por tempo de carregamento através do comando partition na ferramenta de linha de comandos bq.

bq --location=LOCATION partition \
    --time_partitioning_type=PARTITION_TYPE \
    --time_partitioning_expiration INTEGER \
    PROJECT_ID:SOURCE_DATASET.SOURCE_TABLE \
    PROJECT_ID:DESTINATION_DATASET.DESTINATION_TABLE

Substitua o seguinte:

  • LOCATION: o nome da sua localização. A flag --location é opcional.
  • PARTITION_TYPE: o tipo de partição. Os valores possíveis incluem DAY, HOUR, MONTH ou YEAR.
  • INTEGER: o tempo de validade da partição, em segundos. Não existe um valor mínimo. O tempo de expiração é avaliado como a data UTC da partição mais o valor inteiro. A flag time_partitioning_expiration é opcional.
  • PROJECT_ID: o ID do seu projeto.
  • SOURCE_DATASET: o conjunto de dados que contém as tabelas divididas por datas.
  • SOURCE_TABLE: o prefixo das tabelas divididas por datas.
  • DESTINATION_DATASET; O conjunto de dados para a nova tabela particionada.
  • DESTINATION_TABLE; O nome da tabela particionada a criar.

O comando partition não suporta as marcas --label, --expiration, --add_tags nem --description. Pode adicionar etiquetas, uma data de validade da tabela, etiquetas e uma descrição à tabela depois de a criar.

Quando executa o comando partition, o BigQuery cria uma tarefa de cópia que gera partições a partir das tabelas divididas.

O exemplo seguinte cria uma tabela particionada por tempo de ingestão denominada mytable_partitioned a partir de um conjunto de tabelas divididas por datas com o prefixo sourcetable_. A nova tabela é particionada diariamente, com um prazo de validade da partição de 259 200 segundos (3 dias).

bq partition \
    --time_partitioning_type=DAY \
    --time_partitioning_expiration 259200 \
    mydataset.sourcetable_ \
    mydataset.mytable_partitioned

Se as tabelas divididas por data fossem sourcetable_20180126 e sourcetable_20180127, este comando criaria as seguintes partições: mydataset.mytable_partitioned$20180126 e mydataset.mytable_partitioned$20180127.

Segurança da tabela particionada

O controlo de acesso para tabelas particionadas é igual ao controlo de acesso para tabelas padrão. Para mais informações, consulte o artigo Introdução aos controlos de acesso a tabelas.

O que se segue?