授權檢視表

本文說明如何在 BigQuery 建立授權 view 和授權 materialized view。資料管理員可以建立授權檢視表,與特定使用者和群組 (主體) 共用資料集中的部分資料。主體可以查看您共用的資料並執行查詢,但無法直接存取來源資料集。

檢視類型

邏輯檢視表是 BigQuery 的預設檢視表類型,而 materialized view 是預先運算的檢視表,會定期快取查詢結果,以提高效能和效率。

邏輯檢視表的授權檢視表稱為授權檢視表,但 materialized view 的授權檢視表稱為授權 materialized view。

如果邏輯檢視表仰賴大型或運算成本高昂的查詢,則可改為建立 materialized view。如要瞭解邏輯檢視表和 materialized view 的用途,請參閱「邏輯檢視表和 materialized view 總覽」。

建立授權檢視表的大致步驟

如要建立及共用 view,請參閱下列概略步驟。授權邏輯 view 和授權 materialized view 的步驟相同。

  • 建立資料集,以便加入來源資料。
  • 執行查詢,將資料載入來源資料集的目的地資料表。
  • 建立資料集,以便加入授權檢視表。
  • 透過 SQL 查詢建立授權檢視表,限制資料分析師可在查詢結果中查看的資料欄。
  • 授予資料分析師執行查詢工作的權限。
  • 將包含授權檢視表的資料集存取權授予資料分析師。
  • 將來源資料集的檢視權限授予授權檢視表。

替代方案

雖然授權檢視表具有彈性和擴充性,但下列其中一種方法可能更適合您的用途:

  • 設定資料表的資料列層級政策。
  • 在資料表設定資料欄層級政策。
  • 將資料儲存在獨立資料表中。
  • 共用資料集中的所有檢視表 (授權資料集)。

使用資料列層級或資料欄層級安全性,或分隔資料表

資料管理員可以對資料表設定資料列層級存取權政策,或建立獨立資料表來存放機密資料,藉此限制使用者查看該資料。將資料儲存在獨立資料表中,可隔離資料,並移除查看資料表中資料列數量的功能。

此外,資料管理員可以建立及套用政策標記,限制使用者查看資料表資料欄的能力。

將資料儲存在獨立資料表是最安全,但彈性最低的方法。設定資料列層級政策既彈性又安全,而共用授權檢視表則兼具彈性和最佳效能。

如要詳細比較這些方法,請參閱下列資源:

共用資料集中的所有檢視表

如要授予一組檢視表檢視權限,而不必個別授權,可以將檢視表分組到資料集,然後授予該資料集 (包含檢視表) 存取權,讓其存取包含資料的資料集。

接著,您可以視需要授予主體存取權,讓他們存取包含檢視表群組的資料集,或資料集中的個別檢視表。可存取其他資料集的資料集稱為「授權資料集」。授權其他資料集存取其資料的資料集稱為「共用資料集」。

資料集的存取控制清單最多可有 2,500 項授權資源,包括授權檢視表、授權資料集和授權函式。 如果因授權檢視表數量過多而超過這項限制,建議將檢視表分組為授權資料集。 最佳做法是在設計新的 BigQuery 架構 (尤其是多租戶架構) 時,將相關檢視表分組到授權資料集。

詳情請參閱「授權資料集」和「授權資料集」。

限制

  • 在其他資料集中建立授權檢視表或授權 materialized view 時,來源資料集和授權檢視表資料集必須位於相同的區域位置。
  • 刪除授權檢視表後,系統最多可能需要 24 小時,才會將該檢視表從清單中移除。在這段期間,您無法存取已刪除的授權檢視表,但該檢視表可能會顯示在檢視表清單中,並計入授權檢視表限制。如果新的授權檢視表會超出上限,這項限制可防止建立額外的授權檢視表。
  • 您無法在次要副本中建立授權檢視表。詳情請參閱「資料集複製中的資源行為」。

事前準備

授予 Identity and Access Management (IAM) 角色,讓使用者具備必要權限,可查詢您共用的授權檢視表或授權 materialized view。

授權檢視表和 VPC Service Controls

在 VPC Service Controls perimeter 使用授權檢視表時,輸入和輸出規則必須允許主體存取含有檢視表的專案,以及含有檢視表存取來源資料的其他專案。

舉例來說,在下圖中,專案 R 中的呼叫端存取專案 A 中的授權檢視表,其來源資料表位於專案 B。在這種情況下,VPC Service Controls 輸入和輸出規則必須允許專案 R 中的呼叫端使用 BigQuery 服務存取專案 A 和專案 B。

Alt 鍵

VPC Service Controls 存取權的必要權限

主體不需要來源資料專案的 Identity and Access Management 權限,但輸入規則除了允許存取包含檢視表的專案外,還必須允許存取包含來源資料表的來源專案中的 BigQuery 服務。

如要瞭解必要角色和權限,請參閱「專案和資料集的使用者授權」。

輸入和輸出規則

下列 VPC Service Controls 輸入和輸出規則範例,可讓 BigQuery API 存取來源和檢視表專案。

舉例來說,如果您在 PROJECT_A (檢視表) 中建立檢視表,用於存取 PROJECT_B (來源) 中的資料,則需要為 PROJECT_B 建立下列一組輸入規則,並為 PROJECT_A 建立另一組輸入規則:

- ingressFrom:
    identityType: caller_r
    sources:
    - resource:
      - projects/project_r
  ingressTo:
    operations:
    - serviceName: bigquery.googleapis.com
      methodSelectors:
      - method: *
    resources:
    - projects/project_b
  title: Ingress rules for the source project

下列 YAML 檔案顯示 PROJECT_B (來源) 的輸出規則集。您也需要為 PROJECT_A (檢視) 設定一組輸出規則:

- egressTo:
    operations:
    - serviceName: bigquery.googleapis.com
      methodSelectors:
      - method: *
    resources:
    - projects/project_b
  egressFrom:
    identityType: caller_r
    sources:
    - resource:
      - projects/project_r
  title: Egress rules for the source project

必要的角色

如要建立或更新授權檢視表,您必須具備包含該檢視表的資料集權限,以及提供檢視表存取權的資料集權限。

您也需要將包含檢視表的專案和資料集存取權授予使用者或群組。

包含檢視表的資料集權限

在 BigQuery 中,檢視表會視為資料表資源,因此建立檢視表所需的權限與建立資料表相同。您也必須具備權限,才能查詢檢視表 SQL 查詢參照的任何資料表。

  • 如要建立資料集,您必須具備專案的 bigquery.datasets.create IAM 權限。
  • 如要建立檢視表,您必須具備資料集的 bigquery.tables.create IAM 權限。roles/bigquery.dataEditor 預先定義的 IAM 角色包含建立檢視表所需的權限。
  • 如要建立檢視表來查詢您無權存取的資料表,您必須具備檢視表查詢資料表的 bigquery.tables.getData 權限。

如要進一步瞭解 BigQuery 的 IAM 角色和權限,請參閱「預先定義的角色和權限」。

含有來源資料的資料集權限

如要授權檢視表,請授予檢視表對來源資料資料集的讀取權限。

如要執行這項授權,您必須對包含來源資料的資料集具備下列權限:

  • bigquery.datasets.update
  • datasets.getIamPolicy
  • datasets.setIamPolicy

如要瞭解更新資料集所需的其他權限,請參閱必要權限。

檢視表所在專案和資料集的使用者授權

如要與使用者或群組共用授權檢視表,您必須授予使用者或群組下列 IAM 權限:

  • 查詢工作執行所在專案 (計費或執行專案) 的 roles/bigquery.jobUser (或 roles/bigquery.user) IAM 角色。這個角色會授予 bigquery.jobs.create 權限,可對檢視表執行查詢工作。

    無論檢視表託管於何處,您只需要在要執行工作的專案中,具備 roles/bigquery.jobUser IAM 角色。

  • 包含授權檢視表的資料集 roles/bigquery.dataViewer IAM 角色。這個角色會授予 bigquery.tables.getData 權限,這是查詢檢視表所需的權限。

    如果使用者從其他專案查詢授權檢視表,則不需要具備託管檢視表專案的 roles/bigquery.jobUser 角色。他們需要具備檢視表所在資料集的 roles/bigquery.dataViewer 角色,以及執行查詢的專案的 roles/bigquery.jobUser 角色。

使用授權檢視表

以下各節說明如何使用授權 view 和授權 materialized view。

建立授權檢視表

如要建立授權檢視表,請選擇下列其中一個選項。如需授權、共用及刪除授權檢視表的完整步驟,請參閱「建立授權檢視表」教學課程。

控制台

  1. 前往「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中,輸入要用來建立授權檢視表的查詢。

  3. 依序點選「檔案」>「儲存」>「儲存檢視畫面」。

  4. 在「Save view」(儲存檢視畫面) 對話方塊中,執行下列操作:

    1. 在「專案」部分,輸入要儲存檢視表的專案。

    2. 在「資料集」部分,輸入要儲存檢視表的資料集。這個資料集必須與來源查詢中使用的資料集不同。

    3. 在「Table」(資料表) 中輸入檢視表名稱。

    4. 按一下 [儲存]。

  5. 將必要權限授予可使用授權 view 的使用者。

  6. 在「Explorer」窗格中,選取來源查詢使用的資料集。

  7. 在「Details」(詳細資料) 窗格中,依序點選「Sharing」(共用) >「Authorize views」(授權檢視表)。

  8. 在「Authorized views」(授權檢視表) 窗格中,在「Authorized view」(授權檢視表) 部分,輸入檢視表的完整名稱,格式為 PROJECT_ID.DATASET_ID.VIEW_NAME。

  9. 按一下「新增授權」。

Terraform

如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。

# Creates an authorized view.

# Create a dataset to contain the view.
resource "google_bigquery_dataset" "view_dataset" {
  dataset_id  = "view_dataset"
  description = "Dataset that contains the view"
  location    = "us-west1"
}

# Create the view to authorize.
resource "google_bigquery_table" "movie_view" {
  project     = google_bigquery_dataset.view_dataset.project
  dataset_id  = google_bigquery_dataset.view_dataset.dataset_id
  table_id    = "movie_view"
  description = "View to authorize"

  view {
    query          = "SELECT item_id, avg(rating) FROM `movie_project.movie_dataset.movie_ratings` GROUP BY item_id ORDER BY item_id;"
    use_legacy_sql = false
  }
}


# Authorize the view to access the dataset
# that the query data originates from.
resource "google_bigquery_dataset_access" "view_authorization" {
  project    = "movie_project"
  dataset_id = "movie_dataset"

  view {
    project_id = google_bigquery_table.movie_view.project
    dataset_id = google_bigquery_table.movie_view.dataset_id
    table_id   = google_bigquery_table.movie_view.table_id
  }
}

# Specify the IAM policy for principals that can access
# the authorized view. These users should already
# have the roles/bigqueryUser role at the project level.
data "google_iam_policy" "principals_policy" {
  binding {
    role = "roles/bigquery.dataViewer"
    members = [
      "group:example-group@example.com",
    ]
  }
}

# Set the IAM policy on the authorized  view.
resource "google_bigquery_table_iam_policy" "authorized_view_policy" {
  project     = google_bigquery_table.movie_view.project
  dataset_id  = google_bigquery_table.movie_view.dataset_id
  table_id    = google_bigquery_table.movie_view.table_id
  policy_data = data.google_iam_policy.principals_policy.policy_data
}

如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節的步驟。

準備 Cloud Shell

  1. 啟動 Cloud Shell。
  2. 設定要套用 Terraform 設定的預設 Google Cloud 專案。

    每個專案只需執行這個指令一次,而且可以在任何目錄中執行。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 設定檔中設定明確的值,環境變數就會遭到覆寫。

準備目錄

每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。

  1. 在 Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱必須有 .tf 副檔名,例如 main.tf。在本教學課程中,這個檔案稱為 main.tf。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您正在按照教學課程操作,可以複製每個章節或步驟中的程式碼範例。

    將程式碼範例複製到新建立的 main.tf。

    您也可以從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您採用這種做法。

  3. 請查看並修改範例參數,以便套用至您的環境。
  4. 儲存變更。
  5. 初始化 Terraform。每個目錄只需執行一次這項操作。
    terraform init

    如要使用最新版 Google 供應商,請視需要加入 -upgrade 選項:

    terraform init -upgrade

套用變更

  1. 查看設定,確認 Terraform 要建立或更新的資源符合預期:
    terraform plan

    視需要修正設定。

  2. 執行下列指令,並在提示中輸入 yes,套用 Terraform 設定:
    terraform apply

    等待 Terraform 顯示「Apply complete!」訊息。

  3. 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台的使用者介面中,前往資源頁面,確認 Terraform 已建立或更新資源。

管理授權檢視表的使用者或群組

授權檢視表後,您可以對資料集、資料表或檢視表完成下列工作,以維持檢視表的存取權:

  • 查看存取權政策。
  • 授予存取權。
  • 撤銷存取權。
  • 拒絕存取。

詳情請參閱「使用 IAM 控管資源存取權」。

移除檢視表的授權

如要移除檢視畫面的授權,請選取下列其中一個選項:

控制台

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 點選左側窗格中的 「Explorer」。

    醒目顯示的「Explorer」窗格按鈕。

    如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。

  3. 在「Explorer」窗格中展開專案,點選「Datasets」(資料集),然後選取資料集。

  4. 依序點選「總覽」 >「資料表」,然後選取資料表。

  5. 依序點選「 共用」>「授權檢視表」。

  6. 按一下 即可移除授權。

  7. 按一下 [關閉]。

bq

如要移除檢視表的授權,請使用 bq rm 指令。輸入要移除授權的檢視表 table_id。

    bq rm \
    project_id:dataset:table_id
    

API

呼叫 tables.delete 方法,並使用 projectID、datasetID 和 tableID 屬性,移除資料集的授權檢視表。詳情請參閱「資料表」。

撤銷授權和 VPC Service Controls

當授權檢視表跨 VPC Service Controls 邊界存取來源資料集中的資料時,查詢檢視表會略過對基礎資料表的標準 VPC Service Controls 檢查。

如果您撤銷或移除來源資料集的檢視表授權,BigQuery 會改用標準授權檢查,並直接查詢來源專案中的基礎資料表。如果這些基礎資料表跨越 VPC Service Controls perimeter 邊界,且沒有明確的輸出規則允許直接存取資料表,VPC Service Controls 就會封鎖查詢,並傳回輸入或輸出違規錯誤。

當您還原來源資料集上檢視表的授權時,BigQuery 會再次略過直接基礎資料表檢查,並解決 VPC Service Controls 錯誤。

配額與限制

  • 授權檢視表受資料集限制。詳情請參閱「資料集限制」。
  • 移除授權檢視表後,系統最多可能需要 24 小時,才會移除所有參照該檢視表的項目。為避免發生錯誤,請在 24 小時後再重複使用已移除資料檢視的名稱,或為資料檢視建立不重複的名稱。

進階主題

以下各節說明使用授權檢視表的進階方法。

結合資料列層級安全防護機制與授權檢視表

邏輯檢視表或 materialized view 中顯示的資料,會根據基礎來源資料表的資料列層級存取權政策進行篩選。

如要進一步瞭解資料列層級安全性與 materialized view 的互動方式,請參閱「搭配使用資料列層級安全性與其他 BigQuery 功能」。

結合資料欄層級安全防護機制與授權檢視表

資料欄層級安全性對檢視表的影響,與檢視表是否為授權檢視表無關。

如要進一步瞭解權限的套用方式,請參閱「查詢檢視表」一文,瞭解資料欄層級安全性。

使用 BigQuery sharing 和授權檢視表

BigQuery sharing (舊稱 Analytics Hub) 是資料交換平台,具備下列功能:

  • 可讓您跨組織界線大規模分享資料和洞察資訊。
  • 採用完善的安全性和隱私權架構。
  • 支援將 BigQuery 資料集 (稱為共用資料集) 及其相關聯的授權檢視表和授權資料集,發布給一組訂閱者。

連結資料集是唯讀 BigQuery 資料集,做為共用資料集的指標或參照。訂閱共用資訊後,系統會在您的專案中建立連結的資料集,但不會複製資料集,因此訂閱者可以讀取資料,但無法新增或更新其中的物件。

不支援參照連結資料集中資料表的 materialized view。

詳情請參閱「共用簡介」。

後續步驟