Membuat tabel berpartisi

Halaman ini menjelaskan cara membuat tabel berpartisi di BigQuery. Untuk ringkasan tabel berpartisi, lihat Pengantar tabel berpartisi.

Sebelum memulai

Berikan peran Identity and Access Management (IAM) yang memberi pengguna izin yang diperlukan untuk melakukan setiap tugas dalam dokumen ini.

Izin yang diperlukan

Untuk membuat tabel, Anda memerlukan izin IAM berikut:

  • bigquery.tables.create
  • bigquery.tables.updateData
  • bigquery.jobs.create

Selain itu, Anda mungkin memerlukan izin bigquery.tables.getData untuk mengakses data yang Anda tulis ke tabel.

Setiap peran IAM yang telah ditetapkan berikut menyertakan izin yang Anda perlukan untuk membuat tabel:

  • roles/bigquery.dataEditor
  • roles/bigquery.dataOwner
  • roles/bigquery.admin (termasuk izin bigquery.jobs.create)
  • roles/bigquery.user (termasuk izin bigquery.jobs.create)
  • roles/bigquery.jobUser (termasuk izin bigquery.jobs.create)

Selain itu, jika memiliki izin bigquery.datasets.create, Anda dapat membuat dan memperbarui tabel di set data yang Anda buat.

Untuk mengetahui informasi selengkapnya tentang peran dan izin IAM dalam BigQuery, baca Peran dan izin yang telah ditetapkan.

Membuat tabel berpartisi kosong

Langkah-langkah untuk membuat tabel berpartisi di BigQuery mirip dengan membuat tabel standar, hanya saja Anda perlu menentukan opsi partisi, beserta opsi tabel lainnya.

Buat tabel pembagian kolom unit waktu

Untuk membuat tabel berpartisi kolom unit waktu yang kosong dengan definisi skema:

Konsol

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project Anda, lalu pilih set data.
  3. Di bagian Dataset info, klik Create table.
  4. Di panel Create table, tentukan detail berikut:
    1. Di bagian Source, pilih Empty table dalam daftar Create table from.
    2. Di bagian Destination, tentukan detail berikut:
      1. Untuk Dataset, pilih set data tempat Anda ingin membuat tabel.
      2. Di kolom Table, masukkan nama tabel yang ingin Anda buat.
      3. Pastikan kolom Table type disetel ke Native table.
    3. Di bagian Schema, masukkan definisi skema. Skema harus menyertakan kolom DATE, TIMESTAMP, atau DATETIME untuk kolom partisi. Untuk mengetahui informasi selengkapnya, lihat Menentukan skema. Anda dapat memasukkan informasi skema secara manual menggunakan salah satu metode berikut:
      • Opsi 1: Klik Edit as text dan tempelkan skema dalam bentuk array JSON. Saat menggunakan array JSON, Anda menghasilkan skema menggunakan proses yang sama seperti membuat file skema JSON. Anda dapat melihat skema tabel yang ada dalam format JSON dengan memasukkan perintah berikut:
            bq show --format=prettyjson dataset.table
            
      • Opsi 2: Klik Add field, lalu masukkan skema tabel. Tentukan Name, Type, dan Mode untuk setiap kolom.
    4. Di bagian Partition and cluster settings, dalam daftar Partitioning, pilih Partition by field, lalu pilih kolom partisi kolom. Opsi ini hanya tersedia jika skema berisi kolom DATE, TIMESTAMP, atau DATETIME.
    5. Opsional: Untuk mewajibkan filter partisi pada semua kueri untuk tabel ini, centang kotak Require partition filter. Filter partisi dapat mengurangi biaya dan meningkatkan performa. Untuk informasi selengkapnya, lihat Menetapkan persyaratan filter partisi.
    6. Pilih Partitioning type untuk memilih partisi harian, per jam, bulanan, atau tahunan.
    7. Opsional: Di bagian Advanced options, jika ingin menggunakan kunci enkripsi yang dikelola pelanggan, pilih opsi Use a customer-managed encryption key (CMEK). Secara default, BigQuery mengenkripsi konten pelanggan yang disimpan dalam penyimpanan dengan menggunakan kunci milik dan dikelola Google.
    8. Klik Create table.

SQL

Untuk membuat tabel berpartisi kolom unit waktu, gunakan pernyataan DDL CREATE TABLE dengan klausa PARTITION BY.

Contoh berikut membuat tabel dengan partisi harian berdasarkan kolom transaction_date:

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

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

    Gunakan klausa OPTIONS untuk menetapkan opsi tabel seperti masa berlaku partisi dan persyaratan filter partisi.

  3. Klik Run.

Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.

Jenis partisi default untuk kolom DATE adalah partisi harian. Untuk menentukan jenis partisi yang berbeda, sertakan fungsi DATE_TRUNC dalam klausa PARTITION BY. Misalnya, kueri berikut membuat tabel dengan partisi bulanan:

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

Anda juga dapat menentukan kolom TIMESTAMP atau DATETIME sebagai kolom partisi. Dalam hal ini, sertakan fungsi TIMESTAMP_TRUNC atau DATETIME_TRUNC dalam klausa PARTITION BY untuk menentukan jenis partisi. Misalnya, pernyataan berikut membuat tabel dengan partisi harian berdasarkan kolom 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 Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google 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. Gunakan perintah bq mk dengan flag --table (atau pintasan -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

    Ganti kode berikut:

    • SCHEMA: Definisi skema dalam format column:data_type,column:data_type atau jalur ke file skema JSON di mesin lokal Anda. Untuk mengetahui informasi selengkapnya, lihat Menentukan skema.
    • COLUMN: Nama kolom partisi. Dalam skema tabel, kolom ini harus berjenis TIMESTAMP, DATETIME, atau DATE.
    • UNIT_TIME: Jenis partisi. Nilai yang didukung mencakup DAY, HOUR, MONTH, atau YEAR.
    • EXPIRATION_TIME: Waktu habis masa berlaku untuk partisi tabel, dalam detik. Flag --time_partitioning_expiration bersifat opsional. Untuk mengetahui informasi selengkapnya, lihat Menetapkan masa berlaku partisi.
    • BOOLEAN: Jika true, kueri pada tabel ini harus menyertakan filter partisi. Flag --require_partition_filter bersifat opsional. Untuk informasi selengkapnya, lihat Menetapkan persyaratan filter partisi.
    • PROJECT_ID: Project ID. Jika dihilangkan, project default Anda akan digunakan.
    • DATASET: Nama set data di project Anda.
    • TABLE: Nama tabel yang akan dibuat.

    Untuk opsi command line lainnya, lihat bq mk.

    Contoh berikut membuat tabel bernama mytable yang dipartisi pada kolom ts, menggunakan partisi per jam. Masa berlaku partisi adalah 259.200 detik (3 hari).

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

Terraform

Gunakan resource google_bigquery_table.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

Contoh berikut membuat tabel bernama mytable yang dipartisi berdasarkan hari:

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

}

Untuk menerapkan konfigurasi Terraform di project Google Cloud, selesaikan langkah-langkah di bagian berikut.

Menyiapkan Cloud Shell

  1. Luncurkan Cloud Shell.
  2. Tetapkan project Google Cloud default tempat Anda ingin menerapkan konfigurasi Terraform.

    Anda hanya perlu menjalankan perintah ini sekali per project, dan dapat dijalankan di direktori mana pun.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Variabel lingkungan akan diganti jika Anda menetapkan nilai eksplisit dalam file konfigurasi Terraform.

Menyiapkan direktori

Setiap file konfigurasi Terraform harus memiliki direktorinya sendiri (juga disebut modul root).

  1. Di Cloud Shell, buat direktori dan file baru di dalam direktori tersebut. Nama file harus memiliki ekstensi .tf—misalnya main.tf. Dalam tutorial ini, file ini disebut sebagai main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Jika mengikuti tutorial, Anda dapat menyalin kode contoh di setiap bagian atau langkah.

    Salin kode contoh ke dalam main.tf yang baru dibuat.

    Atau, salin kode dari GitHub. Tindakan ini direkomendasikan jika cuplikan Terraform adalah bagian dari solusi menyeluruh.

  3. Tinjau dan ubah contoh parameter untuk diterapkan pada lingkungan Anda.
  4. Simpan perubahan Anda.
  5. Lakukan inisialisasi Terraform. Anda hanya perlu melakukan ini sekali per direktori.
    terraform init

    Secara opsional, untuk menggunakan versi penyedia Google terbaru, sertakan opsi -upgrade:

    terraform init -upgrade

Menerapkan perubahan

  1. Tinjau konfigurasi dan pastikan resource yang akan dibuat atau diupdate oleh Terraform sesuai yang Anda inginkan:
    terraform plan

    Koreksi konfigurasi jika diperlukan.

  2. Terapkan konfigurasi Terraform dengan menjalankan perintah berikut dan memasukkan yes pada prompt:
    terraform apply

    Tunggu hingga Terraform menampilkan pesan "Apply complete!".

  3. Buka project Google Cloud Anda untuk melihat hasilnya. Di Konsol Google Cloud, buka resource Anda di UI untuk memastikan bahwa Terraform telah membuat atau mengupdatenya.

API

Panggil metode tables.insert dengan resource tabel yang ditetapkan yang menentukan properti timePartitioning dan properti schema.

Go

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Go API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Node.js API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Python API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Membuat tabel berpartisi berdasarkan waktu penyerapan

Untuk membuat tabel berpartisi berdasarkan waktu penyerapan yang kosong dengan definisi skema:

Konsol

  1. Buka halaman BigQuery di konsol Google Cloud.

    Buka halaman BigQuery

  2. Di panel Penjelajah, luaskan project Anda dan pilih set data.

  3. Luaskan opsi Actions dan klik Open.

  4. Di panel detail, klik Create table .

  5. Di halaman Create table, di bagian Source, pilih Empty table.

  6. Di bagian Destination:

    • Untuk Dataset name, pilih set data yang sesuai.
    • Di kolom Table name, masukkan nama tabel.
    • Pastikan Table type disetel ke Native table.
  7. Di bagian Schema, masukkan definisi skema.

  8. Di bagian Partition and cluster settings, untuk Partitioning, klik Partition by ingestion time.

  9. (Opsional) Untuk mewajibkan filter partisi pada semua kueri untuk tabel ini, centang kotak Require partition filter. Mewajibkan filter partisi dapat mengurangi biaya dan meningkatkan performa. Untuk informasi selengkapnya, lihat Menetapkan persyaratan filter partisi.

  10. Klik Create table.

SQL

Untuk membuat tabel berpartisi berdasarkan waktu penyerapan, gunakan pernyataan CREATE TABLE dengan klausa PARTITION BY yang menjadi partisi di _PARTITIONDATE.

Contoh berikut membuat tabel dengan partisi harian:

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

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

    Gunakan klausa OPTIONS untuk menetapkan opsi tabel seperti masa berlaku partisi dan persyaratan filter partisi.

  3. Klik Run.

Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.

Jenis partisi default untuk partisi waktu penyerapan adalah partisi harian. Untuk menentukan jenis partisi yang berbeda, sertakan fungsi DATE_TRUNC dalam klausa PARTITION BY. Misalnya, kueri berikut membuat tabel dengan partisi bulanan:

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 Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google 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. Gunakan perintah bq mk dengan flag --table (atau pintasan -t):

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

    Ganti kode berikut:

    • SCHEMA: Definisi dalam format column:data_type,column:data_type atau jalur ke file skema JSON di mesin lokal Anda. Untuk mengetahui informasi selengkapnya, lihat Menentukan skema.
    • UNIT_TIME: Jenis partisi. Nilai yang didukung mencakup DAY, HOUR, MONTH, atau YEAR.
    • EXPIRATION_TIME: Waktu habis masa berlaku untuk partisi tabel, dalam detik. Flag --time_partitioning_expiration bersifat opsional. Untuk mengetahui informasi selengkapnya, lihat Menetapkan masa berlaku partisi.
    • BOOLEAN: Jika true, kueri pada tabel ini harus menyertakan filter partisi. Flag --require_partition_filter bersifat opsional. Untuk informasi selengkapnya, lihat Menetapkan persyaratan filter partisi.
    • PROJECT_ID: Project ID. Jika dihilangkan, project default Anda akan digunakan.
    • DATASET: Nama set data di project Anda.
    • TABLE: Nama tabel yang akan dibuat.

    Untuk opsi command line lainnya, lihat bq mk.

    Contoh berikut membuat tabel berpartisi berdasarkan waktu penyerapan yang bernama mytable. Tabel ini memiliki partisi harian, dengan masa berlaku partisi 259.200 detik (3 hari).

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

Terraform

Gunakan resource google_bigquery_table.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

Contoh berikut membuat tabel bernama mytable yang dipartisi berdasarkan waktu penyerapan:

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

}

Untuk menerapkan konfigurasi Terraform di project Google Cloud, selesaikan langkah-langkah di bagian berikut.

Menyiapkan Cloud Shell

  1. Luncurkan Cloud Shell.
  2. Tetapkan project Google Cloud default tempat Anda ingin menerapkan konfigurasi Terraform.

    Anda hanya perlu menjalankan perintah ini sekali per project, dan dapat dijalankan di direktori mana pun.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Variabel lingkungan akan diganti jika Anda menetapkan nilai eksplisit dalam file konfigurasi Terraform.

Menyiapkan direktori

Setiap file konfigurasi Terraform harus memiliki direktorinya sendiri (juga disebut modul root).

  1. Di Cloud Shell, buat direktori dan file baru di dalam direktori tersebut. Nama file harus memiliki ekstensi .tf—misalnya main.tf. Dalam tutorial ini, file ini disebut sebagai main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Jika mengikuti tutorial, Anda dapat menyalin kode contoh di setiap bagian atau langkah.

    Salin kode contoh ke dalam main.tf yang baru dibuat.

    Atau, salin kode dari GitHub. Tindakan ini direkomendasikan jika cuplikan Terraform adalah bagian dari solusi menyeluruh.

  3. Tinjau dan ubah contoh parameter untuk diterapkan pada lingkungan Anda.
  4. Simpan perubahan Anda.
  5. Lakukan inisialisasi Terraform. Anda hanya perlu melakukan ini sekali per direktori.
    terraform init

    Secara opsional, untuk menggunakan versi penyedia Google terbaru, sertakan opsi -upgrade:

    terraform init -upgrade

Menerapkan perubahan

  1. Tinjau konfigurasi dan pastikan resource yang akan dibuat atau diupdate oleh Terraform sesuai yang Anda inginkan:
    terraform plan

    Koreksi konfigurasi jika diperlukan.

  2. Terapkan konfigurasi Terraform dengan menjalankan perintah berikut dan memasukkan yes pada prompt:
    terraform apply

    Tunggu hingga Terraform menampilkan pesan "Apply complete!".

  3. Buka project Google Cloud Anda untuk melihat hasilnya. Di Konsol Google Cloud, buka resource Anda di UI untuk memastikan bahwa Terraform telah membuat atau mengupdatenya.

API

Panggil metode tables.insert dengan resource tabel yang ditetapkan yang menentukan properti timePartitioning dan properti schema.

Membuat tabel berpartisi berdasarkan rentang bilangan bulat

Untuk membuat tabel berpartisi berdasarkan rentang bilangan bulat yang kosong dengan definisi skema:

Konsol

  1. Buka halaman BigQuery di konsol Google Cloud.

    Buka halaman BigQuery

  2. Di panel Penjelajah, luaskan project Anda dan pilih set data.

  3. Luaskan opsi Actions dan klik Open.

  4. Di panel detail, klik Create table .

  5. Di halaman Create table, di bagian Source, pilih Empty table.

  6. Di bagian Destination:

    • Untuk Dataset name, pilih set data yang sesuai.
    • Di kolom Table name, masukkan nama tabel.
    • Pastikan Table type disetel ke Native table.
  7. Di bagian Schema, masukkan definisi skema. Pastikan skema menyertakan kolom INTEGER untuk kolom partisi. Untuk mengetahui informasi selengkapnya, lihat Menentukan skema.

  8. Di bagian Partition and cluster settings, dalam menu drop-down Partitioning, pilih Partition by field dan pilih kolom partisi. Opsi ini hanya tersedia jika skema berisi kolom INTEGER.

  9. Berikan nilai untuk Start, End, dan Interval:

    • Start adalah awal rentang partisi pertama (inklusif).
    • End adalah akhir rentang partisi terakhir (eksklusif).
    • Interval adalah lebar setiap rentang partisi.

    Nilai di luar rentang ini masuk ke partisi __UNPARTITIONED__ khusus.

  10. (Opsional) Untuk mewajibkan filter partisi pada semua kueri untuk tabel ini, centang kotak Require partition filter. Mewajibkan filter partisi dapat mengurangi biaya dan meningkatkan performa. Untuk informasi selengkapnya, lihat Menetapkan persyaratan filter partisi.

  11. Klik Create table.

SQL

Untuk membuat tabel berpartisi berdasarkan rentang bilangan bulat, gunakan pernyataan DDL CREATE TABLE dengan klausa PARTITION BY.

Contoh berikut membuat tabel berpartisi pada kolom customer_id dengan start 0, end 100, dan interval 10:

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

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

    Gunakan klausa OPTIONS untuk menetapkan opsi tabel seperti persyaratan filter partisi.

  3. Klik Run.

Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.

bq

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

    Activate Cloud Shell

    At the bottom of the Google 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. Gunakan perintah bq mk dengan flag --table (atau pintasan -t):

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

    Ganti kode berikut:

    • SCHEMA: Definisi skema inline dalam format column:data_type,column:data_type atau jalur ke file skema JSON di mesin lokal Anda. Untuk mengetahui informasi selengkapnya, lihat Menentukan skema.
    • COLUMN_NAME: Nama kolom partisi. Dalam skema tabel, kolom ini harus berjenis INTEGER.
    • START: Awal rentang partisi pertama (inklusif).
    • END: Akhir rentang partisi terakhir (eksklusif).
    • INTERVAL: Lebar setiap rentang partisi.
    • BOOLEAN: Jika true, kueri pada tabel ini harus menyertakan filter partisi. Flag --require_partition_filter bersifat opsional. Untuk informasi selengkapnya, lihat Menetapkan persyaratan filter partisi.
    • PROJECT_ID: Project ID. Jika dihilangkan, project default Anda akan digunakan.
    • DATASET: Nama set data di project Anda.
    • TABLE: Nama tabel yang akan dibuat.

    Nilai di luar rentang partisi masuk ke partisi __UNPARTITIONED__ khusus.

    Untuk opsi command line lainnya, lihat bq mk.

    Contoh berikut membuat tabel bernama mytable yang dipartisi pada kolom customer_id.

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

Terraform

Gunakan resource google_bigquery_table.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

Contoh berikut membuat tabel bernama mytable yang dipartisi berdasarkan rentang bilangan bulat:

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

}

Untuk menerapkan konfigurasi Terraform di project Google Cloud, selesaikan langkah-langkah di bagian berikut.

Menyiapkan Cloud Shell

  1. Luncurkan Cloud Shell.
  2. Tetapkan project Google Cloud default tempat Anda ingin menerapkan konfigurasi Terraform.

    Anda hanya perlu menjalankan perintah ini sekali per project, dan dapat dijalankan di direktori mana pun.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Variabel lingkungan akan diganti jika Anda menetapkan nilai eksplisit dalam file konfigurasi Terraform.

Menyiapkan direktori

Setiap file konfigurasi Terraform harus memiliki direktorinya sendiri (juga disebut modul root).

  1. Di Cloud Shell, buat direktori dan file baru di dalam direktori tersebut. Nama file harus memiliki ekstensi .tf—misalnya main.tf. Dalam tutorial ini, file ini disebut sebagai main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Jika mengikuti tutorial, Anda dapat menyalin kode contoh di setiap bagian atau langkah.

    Salin kode contoh ke dalam main.tf yang baru dibuat.

    Atau, salin kode dari GitHub. Tindakan ini direkomendasikan jika cuplikan Terraform adalah bagian dari solusi menyeluruh.

  3. Tinjau dan ubah contoh parameter untuk diterapkan pada lingkungan Anda.
  4. Simpan perubahan Anda.
  5. Lakukan inisialisasi Terraform. Anda hanya perlu melakukan ini sekali per direktori.
    terraform init

    Secara opsional, untuk menggunakan versi penyedia Google terbaru, sertakan opsi -upgrade:

    terraform init -upgrade

Menerapkan perubahan

  1. Tinjau konfigurasi dan pastikan resource yang akan dibuat atau diupdate oleh Terraform sesuai yang Anda inginkan:
    terraform plan

    Koreksi konfigurasi jika diperlukan.

  2. Terapkan konfigurasi Terraform dengan menjalankan perintah berikut dan memasukkan yes pada prompt:
    terraform apply

    Tunggu hingga Terraform menampilkan pesan "Apply complete!".

  3. Buka project Google Cloud Anda untuk melihat hasilnya. Di Konsol Google Cloud, buka resource Anda di UI untuk memastikan bahwa Terraform telah membuat atau mengupdatenya.

API

Panggil metode tables.insert dengan resource tabel yang ditentukan yang menetapkan properti rangePartitioning dan properti schema.

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Node.js API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Python API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Membuat tabel berpartisi dari hasil kueri

Anda dapat membuat tabel berpartisi dari hasil kueri dengan cara berikut:

  • Dalam SQL, gunakan pernyataan CREATE TABLE ... AS SELECT. Anda dapat menggunakan pendekatan ini untuk membuat tabel berpartisi berdasarkan kolom unit waktu atau rentang bilangan bulat, tetapi bukan waktu penyerapan.
  • Gunakan alat command line bq atau BigQuery API untuk menetapkan tabel tujuan untuk kueri. Saat kueri berjalan, BigQuery akan menulis hasilnya ke tabel tujuan. Anda dapat menggunakan pendekatan ini untuk jenis partisi apa pun.
  • Panggil metode API jobs.insert dan tentukan partisi di properti timePartitioning atau properti rangePartitioning.

SQL

Gunakan pernyataan CREATE TABLE. Sertakan klausa PARTITION BY untuk mengonfigurasi partisi.

Contoh berikut membuat tabel berpartisi pada kolom transaction_date:

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

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

    Gunakan klausa OPTIONS untuk menetapkan opsi tabel seperti persyaratan filter partisi.

  3. Klik Run.

Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.

bq

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

    Activate Cloud Shell

    At the bottom of the Google 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. Untuk membuat tabel berpartisi dari kueri, gunakan perintah bq query dengan flag --destination_table dan flag --time_partitioning_type.

    Partisi kolom unit waktu:

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

    Partisi waktu penyerapan:

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

    Partisi rentang bilangan bulat:

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

    Ganti kode berikut:

    • PROJECT_ID: Project ID. Jika dihilangkan, project default Anda akan digunakan.
    • DATASET: Nama set data di project Anda.
    • TABLE: Nama tabel yang akan dibuat.
    • COLUMN: Nama kolom partisi.
    • UNIT_TIME: Jenis partisi. Nilai yang didukung mencakup DAY, HOUR, MONTH, atau YEAR.
    • START: Awal partisi rentang, inklusif.
    • END: Akhir dari partisi rentang, eksklusif.
    • INTERVAL: Lebar setiap rentang dalam partisi.
    • QUERY_STATEMENT: Kueri yang digunakan untuk mengisi tabel.

    Contoh berikut membuat tabel berpartisi pada kolom transaction_date, menggunakan partisi bulanan.

    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'

    Contoh berikut membuat tabel berpartisi pada kolom customer_id, menggunakan partisi rentang bilangan bulat.

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

    Untuk tabel berpartisi berdasarkan waktu penyerapan, Anda juga dapat memuat data ke partisi tertentu menggunakan dekorator partisi. Contoh berikut membuat tabel berpartisi berdasarkan waktu penyerapan baru dan memuat data ke dalam partisi 20180201 (1 Februari 2018):

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

API

Untuk menyimpan hasil kueri ke tabel berpartisi, panggil metode jobs.insert. Konfigurasikan tugas query. Tentukan tabel tujuan di destinationTable. Tentukan partisi di properti timePartitioning atau properti rangePartitioning.

Mengonversi tabel dengan sharding tanggal menjadi tabel berpartisi berdasarkan waktu penyerapan

Jika sebelumnya telah membuat tabel yang di-sharding berdasarkan tanggal, Anda dapat mengonversi seluruh set tabel terkait menjadi satu tabel berpartisi berdasarkan waktu penyerapan menggunakan perintah partition di alat command line 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

Ganti kode berikut:

  • LOCATION: Nama lokasi Anda. Flag --location bersifat opsional.
  • PARTITION_TYPE: Jenis partisi. Nilai yang memungkinkan mencakup DAY, HOUR, MONTH, atau YEAR.
  • INTEGER: Waktu habis masa berlaku partisi, dalam detik. Tidak ada nilai minimum. Waktu habis masa berlaku dievaluasi ke tanggal UTC partisi ditambah nilai bilangan bulat. Flag time_partitioning_expiration bersifat opsional.
  • PROJECT_ID: Project ID Anda.
  • SOURCE_DATASET: Set data yang berisi tabel yang di-sharding tanggal.
  • SOURCE_TABLE: Awalan tabel yang di-sharding tanggal.
  • DESTINATION_DATASET; Set data untuk tabel berpartisi baru.
  • DESTINATION_TABLE; Nama tabel berpartisi yang akan dibuat.

Perintah partition tidak mendukung flag --label, --expiration, --add_tags, atau --description. Anda dapat menambahkan label, tanggal habis masa berlaku tabel, tag, dan deskripsi ke tabel setelah dibuat.

Saat Anda menjalankan perintah partition, BigQuery akan membuat tugas penyalinan yang menghasilkan partisi dari tabel yang di-sharding.

Contoh berikut membuat tabel berpartisi berdasarkan waktu penyerapan bernama mytable_partitioned dari set tabel yang di-sharding tanggal yang diawali dengan sourcetable_. Tabel baru dipartisi setiap hari, dengan masa berlaku partisi 259.200 detik (3 hari).

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

Jika tabel yang di-sharding tanggal adalah sourcetable_20180126 dan sourcetable_20180127, perintah ini akan membuat partisi berikut: mydataset.mytable_partitioned$20180126 dan mydataset.mytable_partitioned$20180127.

Keamanan tabel berpartisi

Kontrol akses untuk tabel berpartisi sama dengan kontrol akses untuk tabel standar. Untuk mengetahui informasi selengkapnya, lihat Pengantar kontrol akses tabel.

Langkah selanjutnya