建立已授權檢視表

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

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

目標

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

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

費用

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

事前準備

開始本教學課程之前,請使用 Google Cloud Console 建立或選取擇一個專案。

  1. 登入您的 Google 帳戶。

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

  2. 在 GCP Console 的專案選擇器頁面中,選取或建立 GCP 專案。

    前往專案選取器頁面

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

    啟用 API

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

簡介

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

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

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

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

建立來源資料集

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

建立來源資料集:

主控台

  1. 在 Cloud Console 中開啟 BigQuery 網頁版 UI。
    前往 Cloud 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. 在 Cloud Console 中開啟 BigQuery 網頁版 UI。
    前往 Cloud 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. 在 Cloud Console 中開啟 BigQuery 網頁版 UI。
    前往 Cloud 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. 在 Cloud Console 中開啟 BigQuery 網頁版 UI。
    前往 Cloud 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 Console 開啟「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. 按一下 [完成]

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 群組的成員前往 Cloud Console 中的 BigQuery 網頁版 UI。
    前往 Cloud 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 Console 中的「Manage resources」(管理資源) 頁面。

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

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

後續步驟