---
# ----------------------------------------------------------------------------
#
#     ***     AUTO GENERATED CODE    ***    Type: MMv1     ***
#
# ----------------------------------------------------------------------------
#
#     This file is automatically generated by Magic Modules and manual
#     changes will be clobbered when the file is regenerated.
#
#     Please read more about how to change this file in
#     .github/CONTRIBUTING.md.
#
# ----------------------------------------------------------------------------
subcategory: "BigQuery"
description: |-
  Datasets allow you to organize and control access to your tables.
---

# google\_bigquery\_dataset

Datasets allow you to organize and control access to your tables.


To get more information about Dataset, see:

* [API documentation](https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets)
* How-to Guides
    * [Datasets Intro](https://cloud.google.com/bigquery/docs/datasets-intro)

~> **Warning:** You must specify the role field using the legacy format `OWNER` instead of `roles/bigquery.dataOwner`.
The API does accept both formats but it will always return the legacy format which results in Terraform
showing permanent diff on each plan and apply operation.

<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=bigquery_dataset_basic&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Bigquery Dataset Basic


```hcl
resource "google_bigquery_dataset" "dataset" {
  dataset_id                  = "example_dataset"
  friendly_name               = "test"
  description                 = "This is a test description"
  location                    = "EU"
  default_table_expiration_ms = 3600000

  labels = {
    env = "default"
  }

  access {
    role          = "OWNER"
    user_by_email = google_service_account.bqowner.email
  }

  access {
    role   = "READER"
    domain = "hashicorp.com"
  }
}

resource "google_service_account" "bqowner" {
  account_id = "bqowner"
}
```
## Example Usage - Bigquery Dataset Cmek


```hcl
resource "google_bigquery_dataset" "dataset" {
  dataset_id                  = "example_dataset"
  friendly_name               = "test"
  description                 = "This is a test description"
  location                    = "US"
  default_table_expiration_ms = 3600000

  default_encryption_configuration {
    kms_key_name = google_kms_crypto_key.crypto_key.id
  }
}

resource "google_kms_crypto_key" "crypto_key" {
  name     = "example-key"
  key_ring = google_kms_key_ring.key_ring.id
}

resource "google_kms_key_ring" "key_ring" {
  name     = "example-keyring"
  location = "us"
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=bigquery_dataset_authorized_dataset&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Bigquery Dataset Authorized Dataset


```hcl
resource "google_bigquery_dataset" "public" {
  dataset_id                  = "public"
  friendly_name               = "test"
  description                 = "This dataset is public"
  location                    = "EU"
  default_table_expiration_ms = 3600000

  labels = {
    env = "default"
  }

  access {
    role          = "OWNER"
    user_by_email = google_service_account.bqowner.email
  }

  access {
    role   = "READER"
    domain = "hashicorp.com"
  }
}

resource "google_bigquery_dataset" "dataset" {
  dataset_id                  = "private"
  friendly_name               = "test"
  description                 = "This dataset is private"
  location                    = "EU"
  default_table_expiration_ms = 3600000

  labels = {
    env = "default"
  }

  access {
    role          = "OWNER"
    user_by_email = google_service_account.bqowner.email
  }

  access {
    role   = "READER"
    domain = "hashicorp.com"
  }

  access {
    dataset {
      dataset {
        project_id = google_bigquery_dataset.public.project
        dataset_id = google_bigquery_dataset.public.dataset_id
      }
      target_types = ["VIEWS"]
    }
  }
}

resource "google_service_account" "bqowner" {
  account_id = "bqowner"
}
```
## Example Usage - Bigquery Dataset Authorized Routine


```hcl
resource "google_bigquery_dataset" "public" {
  dataset_id  = "public_dataset"
  description = "This dataset is public"
}

resource "google_bigquery_routine" "public" {
  dataset_id      = google_bigquery_dataset.public.dataset_id
  routine_id      = "public_routine"
  routine_type    = "TABLE_VALUED_FUNCTION"
  language        = "SQL"
  definition_body = <<-EOS
    SELECT 1 + value AS value
  EOS
  arguments {
    name          = "value"
    argument_kind = "FIXED_TYPE"
    data_type     = jsonencode({ "typeKind" = "INT64" })
  }
  return_table_type = jsonencode({ "columns" = [
    { "name" = "value", "type" = { "typeKind" = "INT64" } },
  ] })
}

resource "google_bigquery_dataset" "private" {
  dataset_id  = "private_dataset"
  description = "This dataset is private"
  access {
    role          = "OWNER"
    user_by_email = "my@service-account.com"
  }
  access {
    routine {
      project_id = google_bigquery_routine.public.project
      dataset_id = google_bigquery_routine.public.dataset_id
      routine_id = google_bigquery_routine.public.routine_id
    }
  }
}
```
## Example Usage - Bigquery Dataset External Reference Aws Docs


```hcl
resource "google_bigquery_dataset" "dataset" {
  provider                    = google-beta
  dataset_id                  = "example_dataset"
  friendly_name               = "test"
  description                 = "This is a test description"
  location                    = "aws-us-east-1"

  external_dataset_reference {
    external_source = "aws-glue://arn:aws:glue:us-east-1:999999999999:database/database"
    connection      = "projects/project/locations/aws-us-east-1/connections/connection"
  }
}
```

## Argument Reference

The following arguments are supported:


* `dataset_id` -
  (Required)
  A unique ID for this dataset, without the project name. The ID
  must contain only letters (a-z, A-Z), numbers (0-9), or
  underscores (_). The maximum length is 1,024 characters.


- - -


* `max_time_travel_hours` -
  (Optional)
  Defines the time travel window in hours. The value can be from 48 to 168 hours (2 to 7 days).

* `access` -
  (Optional)
  An array of objects that define dataset access for one or more entities.
  Structure is [documented below](#nested_access).

* `default_table_expiration_ms` -
  (Optional)
  The default lifetime of all tables in the dataset, in milliseconds.
  The minimum value is 3600000 milliseconds (one hour).

  Once this property is set, all newly-created tables in the dataset
  will have an `expirationTime` property set to the creation time plus
  the value in this property, and changing the value will only affect
  new tables, not existing ones. When the `expirationTime` for a given
  table is reached, that table will be deleted automatically.
  If a table's `expirationTime` is modified or removed before the
  table expires, or if you provide an explicit `expirationTime` when
  creating a table, that value takes precedence over the default
  expiration time indicated by this property.

* `default_partition_expiration_ms` -
  (Optional)
  The default partition expiration for all partitioned tables in
  the dataset, in milliseconds.

  Once this property is set, all newly-created partitioned tables in
  the dataset will have an `expirationMs` property in the `timePartitioning`
  settings set to this value, and changing the value will only
  affect new tables, not existing ones. The storage in a partition will
  have an expiration time of its partition time plus this value.
  Setting this property overrides the use of `defaultTableExpirationMs`
  for partitioned tables: only one of `defaultTableExpirationMs` and
  `defaultPartitionExpirationMs` will be used for any new partitioned
  table. If you provide an explicit `timePartitioning.expirationMs` when
  creating or updating a partitioned table, that value takes precedence
  over the default partition expiration time indicated by this property.

* `description` -
  (Optional)
  A user-friendly description of the dataset

* `external_dataset_reference` -
  (Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
  Information about the external metadata storage where the dataset is defined.
  Structure is [documented below](#nested_external_dataset_reference).

* `friendly_name` -
  (Optional)
  A descriptive name for the dataset

* `labels` -
  (Optional)
  The labels associated with this dataset. You can use these to
  organize and group your datasets.

  **Note**: This field is non-authoritative, and will only manage the labels present in your configuration.
  Please refer to the field `effective_labels` for all of the labels present on the resource.

* `location` -
  (Optional)
  The geographic location where the dataset should reside.
  See [official docs](https://cloud.google.com/bigquery/docs/dataset-locations).

  There are two types of locations, regional or multi-regional. A regional
  location is a specific geographic place, such as Tokyo, and a multi-regional
  location is a large geographic area, such as the United States, that
  contains at least two geographic places.

  The default value is multi-regional location `US`.
  Changing this forces a new resource to be created.

* `default_encryption_configuration` -
  (Optional)
  The default encryption key for all tables in the dataset. Once this property is set,
  all newly-created partitioned tables in the dataset will have encryption key set to
  this value, unless table creation request (or query) overrides the key.
  Structure is [documented below](#nested_default_encryption_configuration).

* `is_case_insensitive` -
  (Optional)
  TRUE if the dataset and its table names are case-insensitive, otherwise FALSE.
  By default, this is FALSE, which means the dataset and its table names are
  case-sensitive. This field does not affect routine references.

* `default_collation` -
  (Optional)
  Defines the default collation specification of future tables created
  in the dataset. If a table is created in this dataset without table-level
  default collation, then the table inherits the dataset default collation,
  which is applied to the string fields that do not have explicit collation
  specified. A change to this field affects only tables created afterwards,
  and does not alter the existing tables.
  The following values are supported:
  - 'und:ci': undetermined locale, case insensitive.
  - '': empty string. Default to case-sensitive behavior.

* `storage_billing_model` -
  (Optional)
  Specifies the storage billing model for the dataset.
  Set this flag value to LOGICAL to use logical bytes for storage billing,
  or to PHYSICAL to use physical bytes instead.
  LOGICAL is the default if this flag isn't specified.

* `project` - (Optional) The ID of the project in which the resource belongs.
    If it is not provided, the provider project is used.

* `delete_contents_on_destroy` - (Optional) If set to `true`, delete all the tables in the
dataset when destroying the resource; otherwise,
destroying the resource will fail if tables are present.


<a name="nested_access"></a>The `access` block supports:

* `domain` -
  (Optional)
  A domain to grant access to. Any users signed in with the
  domain specified will be granted the specified access

* `group_by_email` -
  (Optional)
  An email address of a Google Group to grant access to.

* `role` -
  (Optional)
  Describes the rights granted to the user specified by the other
  member of the access object. Basic, predefined, and custom roles
  are supported. Predefined roles that have equivalent basic roles
  are swapped by the API to their basic counterparts. See
  [official docs](https://cloud.google.com/bigquery/docs/access-control).

* `special_group` -
  (Optional)
  A special group to grant access to. Possible values include:

  * `projectOwners`: Owners of the enclosing project.

  * `projectReaders`: Readers of the enclosing project.

  * `projectWriters`: Writers of the enclosing project.

  * `allAuthenticatedUsers`: All authenticated BigQuery users.

* `iam_member` -
  (Optional)
  Some other type of member that appears in the IAM Policy but isn't a user,
  group, domain, or special group. For example: `allUsers`

* `user_by_email` -
  (Optional)
  An email address of a user to grant access to. For example:
  fred@example.com

* `view` -
  (Optional)
  A view from a different dataset to grant access to. Queries
  executed against that view will have read access to tables in
  this dataset. The role field is not required when this field is
  set. If that view is updated by any user, access to the view
  needs to be granted again via an update operation.
  Structure is [documented below](#nested_view).

* `dataset` -
  (Optional)
  Grants all resources of particular types in a particular dataset read access to the current dataset.
  Structure is [documented below](#nested_dataset).

* `routine` -
  (Optional)
  A routine from a different dataset to grant access to. Queries
  executed against that routine will have read access to tables in
  this dataset. The role field is not required when this field is
  set. If that routine is updated by any user, access to the routine
  needs to be granted again via an update operation.
  Structure is [documented below](#nested_routine).


<a name="nested_view"></a>The `view` block supports:

* `dataset_id` -
  (Required)
  The ID of the dataset containing this table.

* `project_id` -
  (Required)
  The ID of the project containing this table.

* `table_id` -
  (Required)
  The ID of the table. The ID must contain only letters (a-z,
  A-Z), numbers (0-9), or underscores (_). The maximum length
  is 1,024 characters.

<a name="nested_dataset"></a>The `dataset` block supports:

* `dataset` -
  (Required)
  The dataset this entry applies to
  Structure is [documented below](#nested_dataset).

* `target_types` -
  (Required)
  Which resources in the dataset this entry applies to. Currently, only views are supported,
  but additional target types may be added in the future. Possible values: VIEWS


<a name="nested_dataset"></a>The `dataset` block supports:

* `dataset_id` -
  (Required)
  The ID of the dataset containing this table.

* `project_id` -
  (Required)
  The ID of the project containing this table.

<a name="nested_routine"></a>The `routine` block supports:

* `dataset_id` -
  (Required)
  The ID of the dataset containing this table.

* `project_id` -
  (Required)
  The ID of the project containing this table.

* `routine_id` -
  (Required)
  The ID of the routine. The ID must contain only letters (a-z,
  A-Z), numbers (0-9), or underscores (_). The maximum length
  is 256 characters.

<a name="nested_external_dataset_reference"></a>The `external_dataset_reference` block supports:

* `external_source` -
  (Required)
  External source that backs this dataset.

* `connection` -
  (Required)
  The connection id that is used to access the externalSource.
  Format: projects/{projectId}/locations/{locationId}/connections/{connectionId}

<a name="nested_default_encryption_configuration"></a>The `default_encryption_configuration` block supports:

* `kms_key_name` -
  (Required)
  Describes the Cloud KMS encryption key that will be used to protect destination
  BigQuery table. The BigQuery Service Account associated with your project requires
  access to this encryption key.

## Attributes Reference

In addition to the arguments listed above, the following computed attributes are exported:

* `id` - an identifier for the resource with format `projects/{{project}}/datasets/{{dataset_id}}`

* `creation_time` -
  The time when this dataset was created, in milliseconds since the
  epoch.

* `etag` -
  A hash of the resource.

* `last_modified_time` -
  The date when this dataset or any of its tables was last modified, in
  milliseconds since the epoch.

* `terraform_labels` -
  The combination of labels configured directly on the resource
   and default labels configured on the provider.

* `effective_labels` -
  All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services.
* `self_link` - The URI of the created resource.


## Timeouts

This resource provides the following
[Timeouts](https://developer.hashicorp.com/terraform/plugin/sdkv2/resources/retries-and-customizable-timeouts) configuration options:

- `create` - Default is 20 minutes.
- `update` - Default is 20 minutes.
- `delete` - Default is 20 minutes.

## Import


Dataset can be imported using any of these accepted formats:

* `projects/{{project}}/datasets/{{dataset_id}}`
* `{{project}}/{{dataset_id}}`
* `{{dataset_id}}`


In Terraform v1.5.0 and later, use an [`import` block](https://developer.hashicorp.com/terraform/language/import) to import Dataset using one of the formats above. For example:

```tf
import {
  id = "projects/{{project}}/datasets/{{dataset_id}}"
  to = google_bigquery_dataset.default
}
```

When using the [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import), Dataset can be imported using one of the formats above. For example:

```
$ terraform import google_bigquery_dataset.default projects/{{project}}/datasets/{{dataset_id}}
$ terraform import google_bigquery_dataset.default {{project}}/{{dataset_id}}
$ terraform import google_bigquery_dataset.default {{dataset_id}}
```

## User Project Overrides

This resource supports [User Project Overrides](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference#user_project_override).
