---
# ----------------------------------------------------------------------------
#
#     ***     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: |-
  Collection of resources to manage IAM policy for BigQuery Table
---

# IAM policy for BigQuery Table
Three different resources help you manage your IAM policy for BigQuery Table. Each of these resources serves a different use case:

* `google_bigquery_table_iam_policy`: Authoritative. Sets the IAM policy for the table and replaces any existing policy already attached.
* `google_bigquery_table_iam_binding`: Authoritative for a given role. Updates the IAM policy to grant a role to a list of members. Other roles within the IAM policy for the table are preserved.
* `google_bigquery_table_iam_member`: Non-authoritative. Updates the IAM policy to grant a role to a new member. Other members for the role for the table are preserved.

A data source can be used to retrieve policy data in advent you do not need creation

* `google_bigquery_table_iam_policy`: Retrieves the IAM policy for the table

~> **Note:** `google_bigquery_table_iam_policy` **cannot** be used in conjunction with `google_bigquery_table_iam_binding` and `google_bigquery_table_iam_member` or they will fight over what your policy should be.

~> **Note:** `google_bigquery_table_iam_binding` resources **can be** used in conjunction with `google_bigquery_table_iam_member` resources **only if** they do not grant privilege to the same role.



## google_bigquery_table_iam_policy

```hcl
data "google_iam_policy" "admin" {
  binding {
    role = "roles/bigquery.dataOwner"
    members = [
      "user:jane@example.com",
    ]
  }
}

resource "google_bigquery_table_iam_policy" "policy" {
  project = google_bigquery_table.test.project
  dataset_id = google_bigquery_table.test.dataset_id
  table_id = google_bigquery_table.test.table_id
  policy_data = data.google_iam_policy.admin.policy_data
}
```

## google_bigquery_table_iam_binding

```hcl
resource "google_bigquery_table_iam_binding" "binding" {
  project = google_bigquery_table.test.project
  dataset_id = google_bigquery_table.test.dataset_id
  table_id = google_bigquery_table.test.table_id
  role = "roles/bigquery.dataOwner"
  members = [
    "user:jane@example.com",
  ]
}
```

## google_bigquery_table_iam_member

```hcl
resource "google_bigquery_table_iam_member" "member" {
  project = google_bigquery_table.test.project
  dataset_id = google_bigquery_table.test.dataset_id
  table_id = google_bigquery_table.test.table_id
  role = "roles/bigquery.dataOwner"
  member = "user:jane@example.com"
}
```


## Argument Reference

The following arguments are supported:


* `project` - (Optional) The ID of the project in which the resource belongs.
    If it is not provided, the project will be parsed from the identifier of the parent resource. If no project is provided in the parent identifier and no project is specified, the provider project is used.

* `member/members` - (Required) Identities that will be granted the privilege in `role`.
  Each entry can have one of the following values:
  * **allUsers**: A special identifier that represents anyone who is on the internet; with or without a Google account.
  * **allAuthenticatedUsers**: A special identifier that represents anyone who is authenticated with a Google account or a service account.
  * **user:{emailid}**: An email address that represents a specific Google account. For example, alice@gmail.com or joe@example.com.
  * **serviceAccount:{emailid}**: An email address that represents a service account. For example, my-other-app@appspot.gserviceaccount.com.
  * **group:{emailid}**: An email address that represents a Google group. For example, admins@example.com.
  * **domain:{domain}**: A G Suite domain (primary, instead of alias) name that represents all the users of that domain. For example, google.com or example.com.
  * **projectOwner:projectid**: Owners of the given project. For example, "projectOwner:my-example-project"
  * **projectEditor:projectid**: Editors of the given project. For example, "projectEditor:my-example-project"
  * **projectViewer:projectid**: Viewers of the given project. For example, "projectViewer:my-example-project"

* `role` - (Required) The role that should be applied. Only one
    `google_bigquery_table_iam_binding` can be used per role. Note that custom roles must be of the format
    `[projects|organizations]/{parent-name}/roles/{role-name}`.

* `policy_data` - (Required only by `google_bigquery_table_iam_policy`) The policy data generated by
  a `google_iam_policy` data source.

## Attributes Reference

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

* `etag` - (Computed) The etag of the IAM policy.

## Import

For all import syntaxes, the "resource in question" can take any of the following forms:

* projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}}
* {{project}}/{{dataset_id}}/{{table_id}}
* {{dataset_id}}/{{table_id}}
* {{table_id}}

Any variables not passed in the import command will be taken from the provider configuration.

BigQuery table IAM resources can be imported using the resource identifiers, role, and member.

IAM member imports use space-delimited identifiers: the resource in question, the role, and the member identity, e.g.
```
$ terraform import google_bigquery_table_iam_member.editor "projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}} roles/bigquery.dataOwner user:jane@example.com"
```

IAM binding imports use space-delimited identifiers: the resource in question and the role, e.g.
```
$ terraform import google_bigquery_table_iam_binding.editor "projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}} roles/bigquery.dataOwner"
```

IAM policy imports use the identifier of the resource in question, e.g.
```
$ terraform import google_bigquery_table_iam_policy.editor projects/{{project}}/datasets/{{dataset_id}}/tables/{{table_id}}
```

-> **Custom Roles**: If you're importing a IAM resource with a custom role, make sure to use the
 full name of the custom role, e.g. `[projects/my-project|organizations/my-org]/roles/my-custom-role`.

## User Project Overrides

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