建立授權檢視表

在本教學課程中,您會在 BigQuery 中建立授權檢視表,供資料分析師使用。授權檢視表可讓您與特定使用者和群組分享查詢結果,而不用為他們提供基礎來源資料的存取權。檢視畫面會取得來源資料的存取權,而非使用者或群組。您也可以使用檢視表的 SQL 查詢,從查詢結果中排除資料欄和欄位。

除了使用已授權檢視表,您也可以在來源資料中設定資料欄層級的存取權控管,然後讓使用者存取查詢受控資料的檢視表。如要進一步瞭解資料欄層級的存取權控管,請參閱資料欄層級存取權控管簡介

如果您有多個已授權檢視表存取同一個來源資料集,可以授權內含檢視表的資料集,不必授權個別檢視表。

建立資料集來儲存來源資料

您一開始可以建立儲存來源資料的資料集。

如要建立來源資料集,請選擇下列其中一個選項:

主控台

  1. 前往「BigQuery」頁面

    前往「BigQuery」

  2. 在左側窗格中,按一下「Explorer」

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

    如果沒有看到左側窗格,請按一下「展開左側窗格」圖示 開啟窗格。

  3. 在「Explorer」窗格中,找到要建立資料集的專案,然後依序點選旁邊的 「View actions」(查看動作)>「Create dataset」(建立資料集)

  4. 在「建立資料集」頁面中,執行下列操作:

    1. 在「Dataset ID」(資料集 ID) 中輸入 github_source_data

    2. 確認「位置類型」已選取「多區域」

    3. 如果是「多區域」,請選擇「美國」或「歐盟」。在本教學課程中建立的所有資源都應位於相同的多區域位置。

    4. 點選「建立資料集」

SQL

使用 CREATE SCHEMA DDL 陳述式

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

    前往「BigQuery」

  2. 在查詢編輯器中輸入下列陳述式:

    CREATE SCHEMA github_source_data;

  3. 按一下「執行」

如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。

Java

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

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

// Create a source dataset to store your table.
Dataset sourceDataset = bigquery.create(DatasetInfo.of(sourceDatasetId));

Python

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

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

from google.cloud import bigquery
from google.cloud.bigquery.enums import EntityTypes

client = bigquery.Client()
source_dataset_id = "github_source_data"
source_dataset_id_full = "{}.{}".format(client.project, source_dataset_id)


source_dataset = bigquery.Dataset(source_dataset_id_full)
# 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. 前往「BigQuery」頁面

    前往「BigQuery」

  2. 在查詢編輯器中輸入下列查詢:

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

  4. 在「Destination」(目的地) 部分,選取「Set a destination table for query results」(為查詢結果設定目標資料表)

  5. 在「Dataset」(資料集) 中輸入 PROJECT_ID.github_source_data

    PROJECT_ID 替換為您的專案 ID。

  6. 在「Table Id」中輸入 github_contributors

  7. 按一下 [儲存]

  8. 按一下「執行」

  9. 查詢完成後,在「Explorer」窗格中,依序點選「Datasets」github_source_data 資料集。

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

  11. 如要確認資料已寫入資料表,請按一下「預覽」分頁標籤。

Java

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

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

// Populate a source table
String tableQuery =
    "SELECT commit, author, committer, repo_name"
        + " FROM `bigquery-public-data.github_repos.commits`"
        + " LIMIT 1000";
QueryJobConfiguration queryConfig =
    QueryJobConfiguration.newBuilder(tableQuery)
        .setDestinationTable(TableId.of(sourceDatasetId, sourceTableId))
        .build();
bigquery.query(queryConfig);

Python

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

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

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
"""
client.query_and_wait(
    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 and waits for query to finish

建立資料集來儲存授權檢視表

建立來源資料集之後,您會建立新的獨立資料集,儲存將與資料分析師分享的已授權檢視表。在後續步驟中,您會授權檢視表存取來源資料集中的資料。資料分析師可以存取授權檢視表,但無法直接存取來源資料。

授權檢視區塊應在與來源資料不同的資料集中建立。 這樣一來,資料擁有者就能授權使用者存取已授權檢視表,而不必同時授予基礎資料的存取權。來源資料集和授權檢視區塊資料集必須位於相同的單一地區位置

如要建立儲存檢視表的資料集,請選擇下列其中一個選項:

主控台

  1. 前往「BigQuery」頁面

    前往「BigQuery」

  2. 在左側窗格中,按一下「Explorer」

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

  3. 在「Explorer」窗格中,選取要建立資料集的專案。

  4. 展開「View actions」(查看動作) 選項 ,然後點選「Create dataset」(建立資料集)

  5. 在「建立資料集」頁面中,執行下列操作:

    1. 在「Dataset ID」(資料集 ID) 中輸入 shared_views

    2. 確認「位置類型」已選取「多區域」

    3. 如果是「多區域」,請選擇「美國」或「歐盟」。在本教學課程中建立的所有資源都應位於相同的多區域位置。

    4. 點選「建立資料集」

SQL

使用 CREATE SCHEMA DDL 陳述式

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

    前往「BigQuery」

  2. 在查詢編輯器中輸入下列陳述式:

    CREATE SCHEMA shared_views;

  3. 按一下「執行」

如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。

Java

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

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

// Create a separate dataset to store your view
Dataset sharedDataset = bigquery.create(DatasetInfo.of(sharedDatasetId));

Python

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

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

shared_dataset_id = "shared_views"
shared_dataset_id_full = "{}.{}".format(client.project, shared_dataset_id)


shared_dataset = bigquery.Dataset(shared_dataset_id_full)
shared_dataset.location = "US"
shared_dataset = client.create_dataset(shared_dataset)  # API request

在新資料集中建立授權檢視表

您可在新資料集中建立您想要授權的視圖。這是您與資料分析師分享的視圖。這個檢視表是使用 SQL 查詢建立,可排除您不希望資料分析師看到的資料欄。

github_contributors 來源資料表包含兩個 RECORD 類型的欄位:authorcommitter。在本教學課程中,授權檢視畫面會排除所有作者資料 (作者姓名除外),以及所有提交者資料 (提交者姓名除外)。

如要在新資料集中建立檢視表,請選擇下列任一選項:

主控台

  1. 前往「BigQuery」頁面

    前往「BigQuery」

  2. 在查詢編輯器中輸入下列查詢。

    SELECT
    commit,
    author.name AS author,
    committer.name AS committer,
    repo_name
    FROM
    `PROJECT_ID.github_source_data.github_contributors`;

    PROJECT_ID 替換為您的專案 ID。

  3. 依序點按「儲存」>「儲存檢視畫面」

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

    1. 在「Project」(專案) 部分,確認已選取專案。

    2. 在「Dataset」(資料集) 中輸入 shared_views

    3. 在「Table」(資料表) 中輸入 github_analyst_view

    4. 按一下 [儲存]

SQL

使用 CREATE VIEW DDL 陳述式

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

    前往「BigQuery」

  2. 在查詢編輯器中輸入下列陳述式:

    CREATE VIEW shared_views.github_analyst_view
    AS (
      SELECT
        commit,
        author.name AS author,
        committer.name AS committer,
        repo_name
      FROM
        `PROJECT_ID.github_source_data.github_contributors`
    );

    PROJECT_ID 替換為您的專案 ID。

  3. 按一下「執行」

如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。

Java

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

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

// Create the view in the new dataset
String viewQuery =
    String.format(
        "SELECT commit, author.name as author, committer.name as committer, repo_name FROM %s.%s.%s",
        projectId, sourceDatasetId, sourceTableId);

ViewDefinition viewDefinition = ViewDefinition.of(viewQuery);

Table view =
    bigquery.create(TableInfo.of(TableId.of(sharedDatasetId, sharedViewId), viewDefinition));

Python

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

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

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

授予資料分析師執行查詢工作的權限

資料分析師需要 bigquery.jobs.create 權限才能執行查詢工作,並需要獲得檢視表的存取權,才能查詢檢視表。在本節中,您會將 bigquery.user 角色授予資料分析師。bigquery.user 角色具備 bigquery.jobs.create 權限。稍後您會授予資料分析師存取檢視表的權限。

如要將資料分析師群組指派給專案層級的 bigquery.user 角色,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。

    前往「IAM」(身分與存取權管理) 頁面

  2. 確認已在專案選取器中選取專案。

  3. 按一下 「授予存取權」

  4. 在「授予存取權」對話方塊中,執行下列操作:

    1. 在「New principals」(新增主體) 欄位中,輸入包含資料分析師的群組。例如:data_analysts@example.com

    2. 在「Select a role」(請選擇角色) 欄位中,搜尋並選取「BigQuery User」(BigQuery 使用者) 角色。

    3. 按一下 [儲存]

授予資料分析師查詢已授權檢視表的權限

如要讓資料分析師查詢檢視表,您必須在資料集層級或檢視表層級授予 bigquery.dataViewer 角色。在資料集層級授予這個角色,分析師就能存取資料集中的所有資料表和檢視表。由於本教學課程中建立的資料集只包含一個已授權檢視表,因此您會在資料集層級授予存取權。如果您需要授予存取權給一系列授權檢視表,建議改用授權資料集

您先前授予資料分析師的 bigquery.user 角色,可提供建立查詢工作所需的權限。不過,他們必須同時具備已授權檢視表或內有該檢視表資料集的 bigquery.dataViewer 存取權,才能成功查詢檢視表。

如要授予資料分析師對內含授權檢視表的資料集的 bigquery.dataViewer 存取權,請按照下列步驟操作:

主控台

  1. 前往「BigQuery」頁面

    前往「BigQuery」

  2. 在左側窗格中,按一下「Explorer」

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

  3. 在「Explorer」窗格中,按一下「Datasets」,然後選取「shared_views」資料集,開啟「Details」分頁。

  4. 依序點選「共用」「權限」

  5. 在「分享權限」窗格中,按一下「新增主體」

  6. 在「New principals」(新增主體) 部分,輸入包含資料分析師的群組,例如 data_analysts@example.com

  7. 按一下「選取角色」,然後依序選取「BigQuery」>「BigQuery 資料檢視者」

  8. 按一下 [儲存]

  9. 按一下 [關閉]

Java

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

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

// Assign access controls to the dataset containing the view
List<Acl> viewAcl = new ArrayList<>(sharedDataset.getAcl());
viewAcl.add(Acl.of(new Acl.Group("example-analyst-group@google.com"), Acl.Role.READER));
sharedDataset.toBuilder().setAcl(viewAcl).build().update();

Python

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

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

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

授權視圖存取來源資料集

為內含授權檢視表的資料集建立存取權控制後,您可授予授權檢視表來源資料集的存取權。這項授權會授予該檢視表對來源資料的存取權,而非授予資料分析師群組存取權。

如要授權檢視表存取來源資料,請選擇下列其中一個選項:

主控台

  1. 前往「BigQuery」頁面

    前往「BigQuery」

  2. 在左側窗格中,按一下「Explorer」

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

  3. 在「Explorer」窗格中,按一下「Datasets」,然後選取「github_source_data」資料集,開啟「Details」分頁。

  4. 依序按一下「共用」>「授權檢視」

  5. 在「Authorized views」(授權檢視表) 窗格中,輸入「Authorized view」(授權檢視表) PROJECT_ID.shared_views.github_analyst_view

    PROJECT_ID 替換為您的專案 ID。

  6. 按一下「新增授權」

Java

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

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

// Authorize the view to access the source dataset
List<Acl> srcAcl = new ArrayList<>(sourceDataset.getAcl());
srcAcl.add(Acl.of(new Acl.View(view.getTableId())));
sourceDataset.toBuilder().setAcl(srcAcl).build().update();

Python

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

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

access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, EntityTypes.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. 前往「BigQuery」頁面

    前往「BigQuery」

  2. 在查詢編輯器中輸入下列陳述式:

    SELECT
      *
    FROM
      `PROJECT_ID.shared_views.github_analyst_view`;

    PROJECT_ID 替換為您的專案 ID。

  3. 按一下「執行」

查詢結果類似下方。結果中只會顯示作者名稱和提交者名稱。

查詢授權檢視表後的查詢結果

如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」。

完整原始碼

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

Java

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

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

// Create a source dataset to store your table.
Dataset sourceDataset = bigquery.create(DatasetInfo.of(sourceDatasetId));

// Populate a source table
String tableQuery =
    "SELECT commit, author, committer, repo_name"
        + " FROM `bigquery-public-data.github_repos.commits`"
        + " LIMIT 1000";
QueryJobConfiguration queryConfig =
    QueryJobConfiguration.newBuilder(tableQuery)
        .setDestinationTable(TableId.of(sourceDatasetId, sourceTableId))
        .build();
bigquery.query(queryConfig);

// Create a separate dataset to store your view
Dataset sharedDataset = bigquery.create(DatasetInfo.of(sharedDatasetId));

// Create the view in the new dataset
String viewQuery =
    String.format(
        "SELECT commit, author.name as author, committer.name as committer, repo_name FROM %s.%s.%s",
        projectId, sourceDatasetId, sourceTableId);

ViewDefinition viewDefinition = ViewDefinition.of(viewQuery);

Table view =
    bigquery.create(TableInfo.of(TableId.of(sharedDatasetId, sharedViewId), viewDefinition));

// Assign access controls to the dataset containing the view
List<Acl> viewAcl = new ArrayList<>(sharedDataset.getAcl());
viewAcl.add(Acl.of(new Acl.Group("example-analyst-group@google.com"), Acl.Role.READER));
sharedDataset.toBuilder().setAcl(viewAcl).build().update();

// Authorize the view to access the source dataset
List<Acl> srcAcl = new ArrayList<>(sourceDataset.getAcl());
srcAcl.add(Acl.of(new Acl.View(view.getTableId())));
sourceDataset.toBuilder().setAcl(srcAcl).build().update();

Python

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

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

# Create a source dataset
from google.cloud import bigquery
from google.cloud.bigquery.enums import EntityTypes

client = bigquery.Client()
source_dataset_id = "github_source_data"
source_dataset_id_full = "{}.{}".format(client.project, source_dataset_id)


source_dataset = bigquery.Dataset(source_dataset_id_full)
# 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
"""
client.query_and_wait(
    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 and waits for query to finish

# Create a separate dataset to store your view
shared_dataset_id = "shared_views"
shared_dataset_id_full = "{}.{}".format(client.project, shared_dataset_id)


shared_dataset = bigquery.Dataset(shared_dataset_id_full)
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", EntityTypes.GROUP_BY_EMAIL, 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, EntityTypes.VIEW, view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ["access_entries"]
)  # API request