建立已授權檢視表

BigQuery 是一種 PB 等級的分析資料倉儲,可用來對大量資料執行幾乎即時的 SQL 查詢。

為資料集提供視圖存取權又稱為在 BigQuery 中建立已授權視圖。 已授權視圖可讓您與特定使用者和群組分享查詢結果,而不用為他們提供基礎資料表的存取權。您也可以使用視圖的 SQL 查詢來限制使用者能夠查詢的資料欄 (欄位)。在這個教學課程內容中,您會建立已授權的視圖。

目標

在這個教學課程中,您將執行下列作業:

  • 建立資料集並將存取權控制套用到這些資料集
  • 指派專案的存取權控制
  • 建立限制資料使用者能夠查詢的已授權視圖

費用

BigQuery 是一種付費產品,您在這個教學課程中將會產生 BigQuery 使用費。BigQuery 查詢價格提供每月前 1 TB 用量免費的優惠。詳情請參閱定價頁面。

事前準備

開始本教學課程之前,請先使用 Google Cloud Platform 主控台建立或選取專案。

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 選取或建立 Google Cloud Platform 專案。

    前往「Manage resources」(管理資源) 頁面

  3. 新專案會自動啟用 BigQuery。如要在現有的專案中啟用 BigQuery,請前往 啟用BigQuery API。

    啟用 API

  4. 如果您不想為專案提供信用卡或啟用計費功能,BigQuery 也提供沙箱機制。無論您的專案是否已啟用計費功能,本主題中所述的步驟都適用於您的專案。如果您想要啟用計費功能,請參閱瞭解如何啟用計費功能的相關說明。

簡介

在這個教學課程中,您會建立兩個資料集 - 一個資料集適用於您的來源資料,第二個資料集適用於您的已授權檢視表。您會將來自 GitHub 公開資料集的資料填入來源資料集。然後您會建立在來源資料集中查詢資料表的檢視表。

建立資料集與檢視表後,您可指派存取權控管機制給專案、包含檢視表的資料集,以及包含來源資料的資料集。

為來源資料集提供視圖存取權又稱為建立已授權視圖。當您建立已授權視圖時,請按照下列步驟操作:

  • 建立儲存視圖的單獨資料集
  • 在新資料集中建立視圖
  • 為專案指派存取權控制
  • 為包含檢視表的資料集指派存取權控制
  • 授權視圖存取來源資料集

建立來源資料集

您一開始可以建立儲存來源資料的資料集。針對這個教學課程,您會查詢 GitHub 公開資料集以在來源資料集中填入表格。來源資料集中的資料包含您不想讓資料分析師看見的資訊。您可以使用已授權視圖來限制資料的存取權。

建立來源資料集:

主控台

  1. 在 GCP Console 中開啟 BigQuery 網頁版 UI。
    前往 GCP Console

  2. 在導覽面板的「Resources」(資源) 部分,選取您的專案並按一下 [Create dataset] (建立資料集)

  3. 針對「Dataset ID」(資料集 ID) 輸入 github_source_data

  4. 讓其他設定維持在預設狀態,然後按一下 [Create dataset] (建立資料集)

Python

在試行這個示例前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件

from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = 'github_source_data'

source_dataset = bigquery.Dataset(client.dataset(source_dataset_id))
# Specify the geographic location where the dataset should reside.
source_dataset.location = 'US'
source_dataset = client.create_dataset(source_dataset)  # API request

建立來源資料集之後,您可使用 SQL 查詢在其中填入資料表。此查詢會從 GitHub 公開資料集中擷取資料。

主控台

  1. 在 GCP Console 中開啟 BigQuery 網頁版 UI。
    前往 GCP Console

  2. 按一下 [Compose new query] (撰寫新查詢)

  3. 複製下列查詢並貼到「Query Editor」(查詢編輯器) 文字區域。

    SELECT
      commit,
      author,
      committer,
      repo_name
    FROM
      `bigquery-public-data.github_repos.commits`
    LIMIT
      1000
    
  4. 按一下 [More] (其他選項) 並選取 [Query settings] (查詢設定)

  5. 在「Destination」(目的地) 部分,勾選 [Set a destination table for query results] (為查詢結果設定目標資料表) 方塊。

    • 在「Project name」(專案名稱) 部分,確認已選取專案。
    • 在「Dataset name」(資料集名稱) 部分,確認已選取 github_source_data
    • 在「Table name」(資料表名稱) 部分,輸入:github_contributors
    • 按一下 [Save] (儲存)

  6. 按一下 [Run] (執行)。

  7. 查詢完成時,按一下 [github_contributors],然後按一下 [Preview] (預覽),確認已將資料寫入資料表。

Python

在試行這個示例前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件

source_table_id = 'github_contributors'
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish

建立儲存視圖的單獨資料集

建立來源資料集之後,您會建立新資料集來儲存您將與資料分析師分享的視圖。這個視圖會有來源資料集中資料的存取權。您的資料分析師會有視圖的存取權,而非來源資料的存取權。

當您建立視圖時,必須在與視圖查詢的來源資料不同的資料集中建立那個視圖。因為您只能在資料集層級指派存取權控制,如果在與來源資料相同的資料集中建立視圖,您的資料分析師就會同時擁有視圖與資料的存取權。

建立儲存視圖的資料集:

主控台

  1. 在 GCP Console 中開啟 BigQuery 網頁版 UI。
    前往 GCP Console

  2. 在導覽面板的「Resources」(資源) 部分,選取您的專案並按一下 [Create dataset] (建立資料集)

  3. 在「Dataset ID」(資料集 ID) 部分輸入 shared_views

  4. 讓其他設定維持在預設狀態,然後按一下 [Create dataset] (建立資料集)

Python

在試行這個示例前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件

shared_dataset_id = 'shared_views'
shared_dataset = bigquery.Dataset(client.dataset(shared_dataset_id))
shared_dataset.location = 'US'
shared_dataset = client.create_dataset(shared_dataset)  # API request

在新資料集中建立視圖

您可在新資料集中建立您想要授權的視圖。這是您與資料分析師分享的視圖。這個視圖使用 SQL 查詢建立,其中不包含您不想要資料分析師看見的資料欄。

對於這個教學課程,您分享的視圖不包含除作者姓名以外的所有作者資訊,以及除修訂者姓名以外的所有修訂者資訊。

在新資料集中建立視圖:

主控台

  1. 在 GCP Console 中開啟 BigQuery 網頁版 UI。
    前往 GCP Console

  2. 按一下 [Compose new query] (撰寫新查詢)

  3. 複製下列查詢並貼到「Query Editor」(查詢編輯器) 文字區域。然後將「project-id」改成您的專案 ID。

    SELECT
      commit,
      author.name as author,
      committer.name as committer,
      repo_name
    FROM
      `project_id.github_source_data.github_contributors`
    
  4. 按一下 [More] (其他選項) 並選取 [Query settings] (查詢設定)

  5. 在「SQL dialect」(SQL 方言) 下選取 [Standard] (標準)。按一下 [Save] (儲存) 以更新查詢設定。

  6. 按一下 [Save View] (儲存檢視表)

  7. 在「Save View」(儲存視圖) 對話方塊中:

    • 在「Project name」(專案名稱) 部分,確認已選取專案。
    • 在「Dataset name」(資料集名稱) 部分,確認已選取 shared_views
    • 在「Table name」(資料表名稱) 部分,輸入:github_analyst_view
    • 按一下 [Save] (儲存)

Python

在試行這個示例前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件

shared_view_id = 'github_analyst_view'
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id)
view = client.create_table(view)  # API request

指派專案層級 Cloud IAM 角色給資料分析師

您的資料分析師需要執行查詢工作的權限,才能查詢檢視表。bigquery.user 角色包含執行工作的權限,其中包括在專案內查詢工作。如果您授予使用者或群組專案層級的 bigquery.user 角色,使用者可以建立資料集,並且可以針對這些資料集中的資料表執行查詢工作。bigquery.user 角色不會針對使用者並未建立的資料集授予使用者查詢資料、查看資料表資料或查看資料表結構定義詳細資訊的權限。

將專案層級 bigquery.user 角色指派給資料分析師,並不會賦予他們在包含視圖查詢之資料表的資料集中查看或查詢資料表資料的能力。應該為企業中的大部分個體 (數據資料科學家、企業情報分析師) 指派專案層級 bigquery.user 角色。

針對這個教學課程,您的資料分析師位於名為 data_analysts@example.com 的群組中。這個群組名稱只是作為舉例的目的使用。當您將群組新增至 IAM 角色時,電子郵件地址和網域必須與有效的 Google 帳戶或 Google Apps 帳戶相關聯。

將資料分析師群組指派給專案層級的 bigquery.user 角色:

主控台

  1. 在 Google Cloud Platform 主控台開啟「IAM」頁面。

    開啟 IAM 頁面

  2. 按一下 [選取專案]

  3. 選擇您的專案並點選 [Open]

  4. 在「IAM」(身分與存取權管理) 頁面按一下 [Add] (新增)

  5. 在「Add members」(新增成員) 對話方塊中:

    • 在「Members」(成員) 部分輸入群組名稱:data_analysts@example.com
    • 針對「Roles」(角色),按一下 [Select a role] (請選擇角色) 並選擇 [BIgQuery] > [BigQuery User] (BigQuery 角色)
    • 按一下 [Add] (新增)。

為包含檢視表的資料集指派存取權控制

需要在包含檢視表的資料集上授予 bigquery.dataViewer 角色給資料分析師,資料分析師才能查詢檢視表。bigquery.user 角色提供資料分析師建立查詢工作所需的權限,但他們需具備包含該檢視表之資料集的 bigquery.dataViewer 存取權,才能成功查詢檢視表。

如要授予資料分析師資料集的 bigquery.dataViewer 存取權:

主控台

  1. 在「Resources」(資源) 區段中選取 shared_views 資料集,並按一下 [Share dataset] (分享資料集)

  2. 在「Dataset permissions」(資料集權限) 面板中,按一下 [Add members] (新增成員)

  3. 在「New members」(新增成員) 文字方塊中輸入 data_analysts@example.com

  4. 按一下 [Select role] (選取角色) 並選取 [BigQuery] > [BigQuery Data Viewer] (BigQuery 資料檢視者)

  5. 按一下 [Done] (完成)

Python

在試行這個示例前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件

# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry('READER', 'groupByEmail', analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ['access_entries'])  # API request

授權視圖存取來源資料集

當您建立包含視圖之資料集的存取權控制時,您會將視圖新增為來源資料集中的已授權視圖。這會授予視圖來源資料的存取權,而非資料分析師群組的存取權。

如要授權視圖存取來源資料:

主控台

  1. 從「Resources」(資源) 部分選取 github_source_data 資料集,並按一下 [Share dataset] (分享資料集)

  2. 在「Dataset permissions」(資料集權限) 面板中,按一下 [Authorized views] (已授權視圖) 分頁標籤。

  3. 在「Share authorized view」(分享已授權視圖) 下:

    • 在「Select project」(選取專案) 部分,確認已選取專案。
    • 在「Select dataset」(選取資料集) 部分,選擇 shared_views
    • 在「Select view」(選取檢視表) 部分,輸入檢視表名稱:github_analyst_view
    • 按一下 [OK] (確定)

  4. 按一下 [Add] (新增),然後按一下 [Done] (完成)。

Python

在試行這個示例前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件

access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, 'view', view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ['access_entries'])  # API request

驗證設定

設定完成時,data_analysts 群組的成員可以透過查詢視圖來驗證設定。

驗證設定:

主控台

  1. data_analysts 群組的成員前往 GCP 主控台中的 BigQuery 網頁版 UI。
    前往 GCP Console

  2. 按一下 [Compose new query] (撰寫新查詢)

  3. 複製下列查詢並貼到「Query Editor」(查詢編輯器) 文字區域。

    SELECT
      *
    FROM
      `shared_views.github_analyst_view`
    

完整原始碼

以下是供您參考的完整教學課程原始碼。

Python

在試行這個示例前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件

# Create a source dataset
from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = 'github_source_data'

source_dataset = bigquery.Dataset(client.dataset(source_dataset_id))
# Specify the geographic location where the dataset should reside.
source_dataset.location = 'US'
source_dataset = client.create_dataset(source_dataset)  # API request

# Populate a source table
source_table_id = 'github_contributors'
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish

# Create a separate dataset to store your view
shared_dataset_id = 'shared_views'
shared_dataset = bigquery.Dataset(client.dataset(shared_dataset_id))
shared_dataset.location = 'US'
shared_dataset = client.create_dataset(shared_dataset)  # API request

# Create the view in the new dataset
shared_view_id = 'github_analyst_view'
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id)
view = client.create_table(view)  # API request

# Assign access controls to the dataset containing the view
# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry('READER', 'groupByEmail', analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ['access_entries'])  # API request

# Authorize the view to access the source dataset
access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, 'view', view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ['access_entries'])  # API request

清除所用資源

如何避免系統向您的 Google Cloud Platform 帳戶收取您在本教學課程中使用資源的相關費用:

  1. 前往 GCP 主控台的「Projects」(專案) 頁面。

    前往專案頁面

  2. 在專案清單中選取要刪除的專案,然後按一下 [Delete] (刪除)
  3. 在對話方塊中輸入專案 ID,按一下 [Shut down] (關閉) 即可刪除專案。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁