승인된 뷰 만들기

이 문서에서는 BigQuery에서 승인된 뷰를 만드는 방법을 설명합니다.

다음 방법으로 BigQuery에서 승인된 뷰를 만들 수 있습니다.

  • GCP Console 또는 기본 BigQuery 웹 UI 사용
  • 명령줄 도구의 bq mk 명령어 사용
  • tables.insert API 메서드 호출
  • CREATE VIEW 데이터 정의 언어(DDL) 문 제출
  • 클라이언트 라이브러리 사용

개요

데이터세트에 대한 뷰 액세스 권한 부여는 BigQuery에서 승인된 뷰 생성이라고도 합니다. 승인된 뷰를 사용하면 기본 테이블에 대한 액세스 권한을 부여하지 않고도 특정 사용자 및 그룹과 쿼리 결과를 공유할 수 있습니다. 뷰의 SQL 쿼리를 사용하여 사용자가 쿼리할 수 있는 열(필드)을 제한할 수도 있습니다.

뷰를 만들 때는 뷰가 쿼리하는 소스 데이터와 분리된 데이터세트에 만들어야 합니다. 데이터세트 수준에서만 액세스 제어를 할당할 수 있으므로, 소스 데이터와 같은 데이터세트에 뷰를 만들면 사용자가 뷰와 데이터에 모두 액세스할 수 있습니다.

승인된 뷰를 만드는 가이드는 BigQuery에서 승인된 뷰 만들기를 참조하세요.

필수 권한

승인된 뷰를 만들려면 뷰가 포함된 데이터세트와 뷰에 대한 액세스 권한을 제공하는 데이터세트에 대한 권한이 필요합니다.

뷰가 포함된 데이터세트

뷰는 BigQuery에서 테이블 리소스로 취급되므로 뷰를 만들려면 테이블 만들기와 동일한 권한이 필요합니다. 뷰를 만들려면 최소한 bigquery.tables.create 권한을 부여받아야 합니다. 다음과 같은 사전 정의된 Cloud IAM 역할에는 bigquery.tables.create 권한이 있습니다.

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

또한 사용자에게 bigquery.datasets.create 권한이 있으면 사용자가 데이터세트를 만들 때 이에 대한 bigquery.dataOwner 액세스 권한이 부여됩니다. bigquery.dataOwner 액세스 권한이 있으면 사용자는 데이터세트에서 뷰를 만들 수 있습니다.

BigQuery의 Cloud IAM 역할과 권한에 대한 자세한 내용은 액세스 제어를 참조하세요.

뷰에 대한 액세스 권한을 제공하는 데이터세트

데이터세트 속성을 업데이트하려면 최소한 bigquery.datasets.update 권한과 bigquery.datasets.get 권한을 부여받아야 합니다. 다음과 같은 사전 정의된 Cloud IAM 역할에는 bigquery.datasets.update 권한과 bigquery.datasets.get 권한이 있습니다.

  • bigquery.dataOwner
  • bigquery.admin

또한 사용자에게 bigquery.datasets.create 권한이 있으면 사용자가 데이터세트를 만들 때 이에 대한 bigquery.dataOwner 액세스 권한이 부여됩니다. bigquery.dataOwner 액세스 권한이 있으면 사용자는 자신이 만든 데이터세트의 속성을 업데이트할 수 있습니다.

BigQuery의 Cloud IAM 역할과 권한에 대한 자세한 내용은 액세스 제어를 참조하세요.

데이터세트에 대한 뷰 액세스 권한 부여

데이터세트에 뷰 액세스 권한을 부여하려면 다음 안내를 따르세요.

Console

  1. 탐색 패널의 리소스 섹션에서 프로젝트를 확장하고 데이터세트를 선택합니다.

  2. 창의 오른쪽에 있는 데이터세트 공유를 클릭합니다.

  3. 데이터세트 권한 패널에서 승인된 뷰 탭을 선택합니다.

  4. 승인된 뷰 공유 섹션에서 다음을 수행합니다.

    • 프로젝트 선택에서 프로젝트 이름을 확인합니다. 뷰가 다른 프로젝트에 있는 경우, 해당 프로젝트를 선택해야 합니다.
    • 데이터세트 선택에서 뷰가 포함된 데이터세트를 선택합니다.
    • 보기 선택에서 승인할 뷰를 선택합니다.
  5. 추가를 클릭한 후 완료를 클릭합니다.

기본 UI

  1. 소스 테이블이 포함된 데이터세트 오른쪽에 있는 드롭다운 화살표를 클릭하고 데이터세트 공유를 선택합니다.

  2. 데이터세트 공유 대화상자의 사용자 추가에서 필드 왼쪽의 드롭다운을 클릭하고 승인된 뷰를 선택합니다.

  3. 뷰 선택을 클릭합니다.

  4. 뷰 선택 대화 상자에서 다음을 수행합니다.

    • 프로젝트에서 프로젝트 이름을 확인합니다. 뷰가 다른 프로젝트에 있는 경우, 해당 프로젝트를 선택해야 합니다.
    • 데이터세트에서 뷰를 포함한 데이터세트를 선택합니다.
    • 테이블 ID에 권한을 부여할 뷰 이름을 입력합니다.
    • 확인을 클릭합니다.

      승인된 뷰 선택

  5. 추가를 클릭한 후 변경사항 저장을 클릭합니다.

CLI

  1. show 명령어를 사용하여 JSON 파일에 기존 데이터세트 정보(액세스 제어 포함)를 기록합니다. 데이터세트가 기본 프로젝트 이외의 프로젝트에 있는 경우 데이터세트 이름에 프로젝트 ID를 project_id:dataset 형식으로 추가합니다.

    bq show \
    --format=prettyjson \
    project_id:dataset > path_to_file
    

    각 항목의 의미는 다음과 같습니다.

    • project_id는 프로젝트 ID입니다.
    • dataset는 데이터세트 이름입니다.
    • path_to_file은 로컬 머신의 JSON 파일 경로입니다.

    예:

    다음 명령어를 입력하면 mydataset에 대한 액세스 제어 권한을 JSON 파일에 기록할 수 있습니다. mydataset는 사용자의 기본 프로젝트에 있습니다.

    bq show --format=prettyjson mydataset > /tmp/mydataset.json
    

    다음 명령어를 입력하면 mydataset에 대한 액세스 제어 권한을 JSON 파일에 기록할 수 있습니다. mydatasetmyotherproject에 있습니다.

    bq show --format=prettyjson \
    myotherproject:mydataset > /tmp/mydataset.json
    
  2. JSON 파일의 '액세스' 섹션에 승인된 뷰를 추가합니다.

    예를 들어 데이터세트 JSON 파일의 액세스 섹션은 다음과 같을 수 있습니다.

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      }
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      }
      {
       "role": "READER",
       "domain": "[DOMAIN_NAME]"
      }
      {
       "role": "WRITER",
       "userByEmail": "[USER_EMAIL]"
      }
      {
       "role": "READER",
       "groupByEmail": "[GROUP_EMAIL]"
      },
      {
       "view":{
       "datasetId": "[DATASET_NAME]",
       "projectId": "[PROJECT_NAME]",
       "tableId": "[VIEW_NAME]"
       }
      }
     ],
    }
    

  3. 수정이 완료되면 update 명령어와 --source 플래그를 사용하여 JSON 파일을 포함시킵니다. 데이터세트가 기본 프로젝트 이외의 프로젝트에 있는 경우 데이터세트 이름에 프로젝트 ID를 project_id:dataset 형식으로 추가합니다.

    bq update \
    --source path_to_file \
    project_id:dataset
    

    각 항목의 의미는 다음과 같습니다.

    • path_to_file은 로컬 머신의 JSON 파일 경로입니다.
    • project_id는 프로젝트 ID입니다.
    • dataset는 데이터세트 이름입니다.

    예:

    다음 명령어를 입력하면 mydataset에 대한 액세스 제어를 업데이트할 수 있습니다. mydataset는 기본 프로젝트에 있습니다.

     bq update --source /tmp/mydataset.json mydataset
    

    다음 명령어를 입력하면 mydataset에 대한 액세스 제어 권한을 업데이트할 수 있습니다. mydatasetmyotherproject에 있습니다.

     bq update --source /tmp/mydataset.json myotherproject:mydataset
    
  4. 액세스 제어 변경사항을 확인하려면 파일에 정보를 기록하지 않고 show 명령어를 다시 입력합니다.

    bq show --format=prettyjson [DATASET]
    

    또는

    bq show --format=prettyjson [PROJECT_ID]:[DATASET]
    

API

datasets.patch를 호출하고 access 속성을 사용하여 액세스 제어 권한을 업데이트합니다. 자세한 내용은 데이터세트를 참조하세요.

datasets.update 메소드는 전체 데이터세트 리소스를 대체하기 때문에 액세스 제어를 업데이트하기 위해서는 datasets.patch 메소드를 사용하는 것이 좋습니다.

Go

이 샘플을 시도하기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 확인하세요.

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
srcDataset := client.Dataset(srcDatasetID)
viewDataset := client.Dataset(viewDatasetID)
view := viewDataset.Table(viewID)

// First, we'll add a group to the ACL for the dataset containing the view.  This will allow users within
// that group to query the view, but they must have direct access to any tables referenced by the view.
vMeta, err := viewDataset.Metadata(ctx)
if err != nil {
	return err
}
vUpdateMeta := bigquery.DatasetMetadataToUpdate{
	Access: append(vMeta.Access, &bigquery.AccessEntry{
		Role:       bigquery.ReaderRole,
		EntityType: bigquery.GroupEmailEntity,
		Entity:     "example-analyst-group@google.com",
	}),
}
if _, err := viewDataset.Update(ctx, vUpdateMeta, vMeta.ETag); err != nil {
	return err
}

// Now, we'll authorize a specific view against a source dataset, delegating access enforcement.
// Once this has been completed, members of the group previously added to the view dataset's ACL
// no longer require access to the source dataset to successfully query the view.
srcMeta, err := srcDataset.Metadata(ctx)
if err != nil {
	return err
}
srcUpdateMeta := bigquery.DatasetMetadataToUpdate{
	Access: append(srcMeta.Access, &bigquery.AccessEntry{
		EntityType: bigquery.ViewEntity,
		View:       view,
	}),
}
if _, err := srcDataset.Update(ctx, srcUpdateMeta, srcMeta.ETag); err != nil {
	return err
}

Python

이 샘플을 시도하기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

# from google.cloud import bigquery
# client = bigquery.Client()

# Assign access controls to the dataset containing the view
# shared_dataset_id = 'my_shared_dataset'
# analyst_group_email = 'data_analysts@example.com'
shared_dataset = client.get_dataset(
    client.dataset(shared_dataset_id)
)  # API request
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
# project = 'my-project'
# source_dataset_id = 'my_source_dataset'
source_dataset = client.get_dataset(
    client.dataset(source_dataset_id)
)  # API request
view_reference = {
    "projectId": project,
    "datasetId": shared_dataset_id,
    "tableId": "my_shared_view",
}
access_entries = source_dataset.access_entries
access_entries.append(bigquery.AccessEntry(None, "view", view_reference))
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ["access_entries"]
)  # API request

뷰를 사용하여 행 수준의 액세스 권한 지정

뷰를 사용하여 특정 열(필드)에 대한 액세스를 제한할 수 있습니다. 테이블의 개별 행에 대한 액세스를 제한하려는 경우, 각 사용자나 그룹에 대해 별도로 뷰를 만들 필요가 없습니다. 대신 SESSION_USER() 함수를 사용하여 현재 사용자의 이메일 주소를 반환할 수 있습니다.

다른 사용자에게 다른 행을 표시하려면 해당 행을 볼 수 있는 사용자를 포함한 테이블에 다른 필드를 추가합니다. 그런 다음 SESSION_USER() 함수를 사용하는 뷰를 만듭니다. 다음 예에서 사용자 이름은 allowed_viewer 필드에 저장됩니다.

SELECT
  COLUMN_1,
  COLUMN_2
FROM
  `dataset.view`
WHERE
  allowed_viewer = SESSION_USER()

이 방식의 한계는 한 번에 사용자 한 명에게만 액세스 권한을 부여할 수 있다는 것입니다. allowed_viewer를 반복 필드로 만들면 이 한계를 해결할 수 있습니다. 이 방식을 통해 각 행에 대한 사용자 목록을 제공할 수 있습니다. 하지만 반복 필드를 사용하더라도 테이블에 사용자 이름을 저장하면 여전히 각 행에 액세스 권한을 가진 개별 사용자를 수동으로 추적해야 합니다.

대신 allowed_viewer 필드에 그룹 이름을 입력하고 그룹을 사용자와 매핑하는 별도의 테이블을 만듭니다. 그룹을 사용자와 매핑하는 테이블에는 그룹 이름과 사용자 이름을 저장하는 스키마가 있습니다. 예: {group:string, user_name:string}. 이 방식을 사용하면 데이터를 포함한 테이블과 별도로 사용자와 그룹 정보를 관리할 수 있습니다.

매핑 테이블에 private.access_control 이름을 지정한 경우, 승인된 뷰를 만드는 데 사용되는 SQL 쿼리는 다음과 같습니다.

SELECT
  c.customer,
  c.id
FROM
  `private.customers` c
INNER JOIN (
  SELECT
    group
  FROM
    `private.access_control`
  WHERE
    SESSION_USER() = user_name) g
ON
  c.allowed_group = g.group

다음 단계

  • 뷰 만들기에 대한 자세한 내용은 뷰 만들기를 참조하세요.
  • 뷰 나열에 대한 자세한 내용은 뷰 나열을 참조하세요.
  • 뷰 메타데이터 가져오기에 대한 자세한 내용은 뷰 정보 가져오기를 참조하세요.
  • 뷰 업데이트에 대한 자세한 내용은 뷰 업데이트를 참조하세요.
  • 뷰 관리에 대한 자세한 내용은 뷰 관리를 참조하세요.
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.