뷰 만들기 및 사용

이 문서는 BigQuery에서 뷰를 만들고 사용하는 방법을 설명합니다. 뷰를 만든 후에는 다음을 수행할 수 있습니다.

  • 뷰에 대한 액세스 제어
  • 뷰 정보 가져오기
  • 데이터세트에 뷰 나열
  • 메타 테이블을 사용하여 뷰 메타데이터 가져오기

뷰 속성 업데이트, 뷰 복사, 뷰 삭제 등 뷰 관리에 대한 자세한 내용은 뷰 관리를 참조하세요.

뷰 만들기

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

  • BigQuery 웹 UI 또는 명령줄 도구의 bq mk 명령어를 사용하여 수동으로 만들기
  • tables.insert API 메소드를 호출하여 프로그래매틱 방식으로 만들기
  • CREATE VIEW 데이터 정의 언어(DDL) 문을 제출하여 만들기

BigQuery에서 뷰를 만드는 경우, 뷰 이름은 데이터세트별로 고유해야 합니다. 다음과 같은 뷰 이름을 사용할 수 있습니다.

  • 최대 1,024자 포함
  • 문자(대문자 또는 소문자), 숫자, 밑줄 포함

필수 권한

뷰는 BigQuery에서 테이블 리소스로 취급되므로, 뷰를 만들려면 테이블 만들기와 동일한 권한이 있어야 합니다. 뷰를 만들려면 사용자에게 데이터세트 수준의 WRITER 액세스 권한이 있거나, bigquery.tables.create 권한을 포함하는 프로젝트 수준 IAM 역할이 할당되어 있어야 합니다. 다음 사전 정의된 프로젝트 수준 IAM 역할에는 bigquery.tables.create 권한이 있습니다.

또한 bigquery.user 역할에는 bigquery.datasets.create 권한이 있으므로, bigquery.user 역할에 할당된 사용자는 만드는 모든 데이터세트에서 뷰를 만들 수 있습니다. bigquery.user 역할이 할당된 사용자가 데이터세트를 만들면 사용자에게 데이터세트에 대한 OWNER 액세스 권한이 부여됩니다. 데이터세트에 대한 OWNER 액세스 권한이 있으면 사용자는 해당 데이터세트와 데이터세트에 포함된 모든 테이블 및 뷰를 완전히 제어할 수 있습니다.

BigQuery의 IAM 역할 및 권한에 대한 자세한 내용은 액세스 제어를 참조하세요. 데이터세트 수준 역할에 대한 자세한 내용은 데이터세트 기본 역할을 참조하세요.

뷰 만들기

뷰를 만들려면 다음 단계를 따르세요.

웹 UI

  1. 쿼리를 실행한 후 쿼리 결과 창에서 뷰 저장 버튼을 클릭하여 쿼리를 뷰로 저장합니다.

    뷰 저장

  2. 뷰 저장 대화상자에서 다음을 수행합니다.

    • 프로젝트에서 뷰를 저장할 프로젝트를 선택합니다.
    • 데이터세트에서 뷰를 포함할 데이터세트를 선택합니다. 뷰를 포함하는 데이터세트와 뷰에서 참조되는 테이블을 포함하는 데이터세트가 동일한 위치에 있어야 합니다.
    • 테이블 ID에 뷰 이름을 입력합니다.

      뷰 저장 대화상자

    • 확인을 클릭합니다.

CLI

mk 명령어를 --view 플래그와 함께 사용합니다. 표준 SQL 쿼리의 경우 --use_legacy_sql 플래그를 추가하고 false로 설정합니다. 선택적 매개변수로는 --expiration, --description, --label이 있습니다.

쿼리에서 Google Cloud Storage 또는 로컬 파일에 저장된 외부 사용자 정의 함수 리소스를 참조하는 경우 --view_udf_resource 플래그를 사용하여 해당 리소스를 지정합니다. --view_udf_resource 플래그는 여기서 설명하지 않습니다. UDF 사용에 대한 자세한 내용은 표준 SQL 사용자 정의 함수를 참조하세요.

기본 프로젝트 이외의 다른 프로젝트에 뷰를 만드는 경우 --project_id 플래그를 사용하여 프로젝트 ID를 지정합니다.

bq mk --use_legacy_sql=false --view_udf_resource=[PATH_TO_FILE] --expiration [INTEGER] --description "[DESCRIPTION]" --label [KEY:VALUE, KEY:VALUE] --view '[QUERY]' --project_id [PROJECT_ID] [DATASET].[VIEW]

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

  • [PATH_TO_FILE]은 뷰에 사용되는 사용자 정의 함수 리소스이며, 바로 로드 및 평가될 코드 파일의 URI 또는 로컬 파일 시스템 경로입니다. 여러 파일을 지정하려면 플래그를 반복합니다.
  • [INTEGER]는 뷰의 기본 수명(단위: 초)입니다. 최소값은 3600초(1시간)입니다. 만료 시간은 현재 시간과 정수 값을 더한 값으로 계산됩니다. 뷰 생성 시 만료 시간을 설정하면 데이터세트의 기본 테이블 만료 시간 설정은 무시됩니다.
  • [DESCRIPTION]은 따옴표로 묶인 뷰에 대한 설명입니다.
  • [KEY:VALUE]라벨을 나타내는 키:값 쌍입니다. 쉼표로 구분된 목록을 사용하여 여러 라벨을 입력할 수도 있습니다.
  • [QUERY]는 유효한 쿼리입니다. 표준 SQL 뷰의 경우 쿼리의 테이블과 뷰 참조에 프로젝트 ID가 `[PROJECT_ID].[DATASET].[TABLE]` 형식으로 포함되어야 합니다.
  • [PROJECT_ID]는 프로젝트 ID입니다(기본 프로젝트를 구성하지 않은 경우).
  • [DATASET]는 프로젝트의 데이터세트입니다.
  • [VIEW]는 만들려는 뷰의 이름입니다.

예:

다음 명령어를 입력하여 기본 프로젝트의 mydatasetmyview라는 이름의 뷰를 만듭니다. 만료 시간은 3,600초(1시간), 설명은 This is my view, 라벨은 organization:development로 설정됩니다. 뷰를 만드는 데 사용되는 쿼리는 미국 이름 데이터 공개 데이터세트의 데이터를 쿼리합니다.

bq mk --use_legacy_sql=false --expiration 3600 --description "This is my view" --label organization:development --view 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC' mydataset.myview

다음 명령어를 입력하여 myotherprojectmydatasetmyview라는 이름의 뷰를 만듭니다. 만료 시간은 3,600초(1시간), 설명은 This is my view, 라벨은 organization:development로 설정됩니다. 뷰를 만드는 데 사용되는 쿼리는 미국 이름 데이터 공개 데이터세트의 데이터를 쿼리합니다.

bq mk --use_legacy_sql=false --expiration 3600 --description "This is my view" --label organization:development --view 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC' --project_id myotherproject mydataset.myview

뷰를 만든 후 뷰의 만료 시간, 설명, 라벨을 업데이트할 수 있습니다.

API

view 속성을 포함한 테이블 리소스에서 tables.insert 메소드를 호출합니다.

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")
meta := &bigquery.TableMetadata{
	// This example shows how to create a view of the shakespeare sample dataset, which
	// provides word frequency information.  This view restricts the results to only contain
	// results for works that contain the "king" in the title, e.g. King Lear, King Henry V, etc.
	ViewQuery: "SELECT word, word_count, corpus, corpus_date FROM `bigquery-public-data.samples.shakespeare` WHERE corpus LIKE '%king%'",
}
if err := client.Dataset(datasetID).Table(tableID).Create(ctx, meta); err != nil {
	return err
}

Python

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

# from google.cloud import bigquery
# client = bigquery.Client()
# project = 'my-project'
# source_dataset_id = 'my_source_dataset'
# source_table_id = 'us_states'
# shared_dataset_ref = client.dataset('my_shared_dataset')

# This example shows how to create a shared view of a source table of
# US States. The source table contains all 50 states, while the view will
# contain only states with names starting with 'W'.
view_ref = shared_dataset_ref.table('my_shared_view')
view = bigquery.Table(view_ref)
sql_template = (
    'SELECT name, post_abbr FROM `{}.{}.{}` WHERE name LIKE "W%"')
view.view_query = sql_template.format(
    project, source_dataset_id, source_table_id)
view = client.create_table(view)  # API request

print('Successfully created view at {}'.format(view.full_table_id))

뷰에 대한 액세스 제어

뷰에 액세스 제어를 직접 할당할 수 없습니다. 데이터세트 수준 또는 프로젝트 수준에서 액세스 제어를 구성하여 뷰 액세스를 제어할 수 있습니다.

데이터세트 수준의 액세스 제어는 사용자, 그룹, 서비스 계정이 특정 데이터세트의 뷰에서 수행할 수 있는 작업을 지정합니다. 데이터세트 수준의 권한만 할당할 경우에는 프로젝트에 대한 액세스 권한을 제공하는 기본 또는 사전 정의된 프로젝트 수준 역할(예: bigquery.user)도 할당해야 합니다.

개별 데이터세트에 대한 액세스 권한을 부여하는 대신, 프로젝트의 모든 데이터세트에 포함된 모든 뷰에 대한 권한을 부여하는 사전 정의된 프로젝트 수준 IAM 역할을 할당할 수 있습니다.

IAM 커스텀 역할을 만들 수도 있습니다. 커스텀 역할을 만드는 경우 사용자, 그룹 또는 서비스 계정이 뷰에서 수행할 수 있는 작업에 따라 권한을 부여합니다.

역할과 권한에 대한 자세한 내용은 다음 항목을 참조하세요.

뷰 쿼리

뷰 쿼리는 테이블 쿼리와 동일합니다. 또한 뷰를 쿼리하기 위해 필요한 권한도 테이블 쿼리의 경우와 같습니다. 쿼리 만들기와 제출에 대한 자세한 내용은 BigQuery 데이터 쿼리 소개를 참조하세요.

뷰 사용

뷰 정보 가져오기

BigQuery 웹 UI 또는 bq show CLI 명령어를 사용하거나 tables.get API 메소드를 호출하여 뷰 정보를 가져올 수 있습니다.

필수 권한

뷰 정보를 가져오려면 데이터세트에 대한 READER 역할을 할당받거나, bigquery.tables.get 권한을 포함하는 프로젝트 수준 IAM 역할을 할당받아야 합니다. 프로젝트 수준에서 bigquery.tables.get 권한을 할당 받으면 프로젝트의 모든 뷰에 대한 정보를 가져올 수 있습니다. 사전 정의된 프로젝트 수준의 모든 IAM 역할에는 bigquery.jobUserbigquery.user제외한 bigquery.tables.get 권한이 포함됩니다.

또한 bigquery.user 역할을 할당받은 사용자에게는 bigquery.datasets.create 권한이 있습니다. 따라서 bigquery.user 역할을 할당 받은 사용자는 자신이 만든 모든 데이터세트의 뷰 정보를 가져올 수 있습니다. bigquery.user 역할이 할당된 사용자가 데이터세트를 만들면 사용자에게 데이터세트에 대한 OWNER 액세스 권한이 부여됩니다. 데이터세트에 대한 OWNER 액세스 권한이 있는 사용자는 해당 데이터세트와 데이터세트에 포함된 모든 뷰를 완벽하게 제어할 수 있습니다.

BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 액세스 제어를 참조하세요. 데이터세트 수준 역할에 대한 자세한 내용은 데이터세트 기본 역할을 참조하세요.

뷰 정보 가져오기

뷰 정보 가져오기는 테이블 정보 가져오기 프로세스와 동일합니다.

뷰 정보를 가져오려면 다음 단계를 따르세요.

웹 UI

  1. 데이터세트를 확장합니다.

  2. 뷰 이름을 클릭합니다.

  3. 세부정보를 클릭합니다. 세부정보 뷰 페이지에는 뷰 설명, 뷰 정보, 뷰를 정의하는 SQL 쿼리가 표시됩니다.

    뷰 세부정보

CLI

bq show 명령어를 실행합니다. --format 플래그를 사용하여 출력을 제어할 수 있습니다. 기본 프로젝트가 아닌 다른 프로젝트의 뷰 정보를 가져오는 경우, 프로젝트 ID를 [PROJECT_ID]:[DATASET] 형식으로 데이터세트에 추가합니다.

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

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

  • [PROJECT_ID]는 프로젝트 ID입니다.
  • [DATASET]는 데이터세트 이름입니다.
  • [VIEW]는 뷰 이름입니다.

예:

다음 명령어를 입력하면 기본 프로젝트의 데이터세트 mydataset에서 myview에 대한 정보를 표시합니다.

bq show --format=prettyjson mydataset.myview

다음 명령어를 입력하면 myotherproject에서 데이터세트 mydatasetmyview에 대한 정보를 표시합니다.

bq show --format=prettyjson myotherproject:mydataset.myview

API

tables.get 메소드를 호출하고 관련 매개변수를 제공합니다.

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")
view := client.Dataset(datasetID).Table(viewID)
meta, err := view.Metadata(ctx)
if err != nil {
	return err
}
fmt.Printf("View %s, query: %s\n", view.FullyQualifiedName(), meta.ViewQuery)

Python

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

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

view_ref = client.dataset(shared_dataset_id).table('my_shared_view')
view = client.get_table(view_ref)  # API Request

# Display view properties
print('View at {}'.format(view.full_table_id))
print('View Query:\n{}'.format(view.view_query))

데이터세트의 뷰 나열

BigQuery 웹 UI 또는 bq ls CLI 명령어를 사용하거나 tables.list API 메소드를 호출하여 데이터세트에서 뷰를 나열할 수 있습니다.

필수 권한

데이터세트에서 뷰를 나열하려면 데이터세트에 대한 READER 역할을 할당받거나, bigquery.tables.list 권한을 포함하는 프로젝트 수준 IAM 역할을 할당받아야 합니다. 프로젝트 수준에서 bigquery.tables.list 권한을 할당 받으면 프로젝트에 있는 모든 데이터세트에서 뷰를 나열할 수 있습니다. 사전 정의된 모든 BigQuery IAM 역할에는 bigquery.jobUser제외한 bigquery.tables.list 권한이 포함되어 있습니다.

BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 액세스 제어를 참조하세요. 데이터세트 수준 역할에 대한 자세한 내용은 데이터세트 기본 역할을 참조하세요.

뷰 나열

뷰 나열은 테이블 나열 프로세스와 동일합니다.

데이터세트에서 뷰를 나열하려면 다음 단계를 따르세요.

웹 UI

  1. 웹 UI의 탐색창에서 데이터세트 왼쪽에 있는 파란색 화살표를 클릭하여 펼치거나 데이터세트 이름을 더블클릭합니다. 그러면 데이터세트에 있는 테이블과 뷰가 표시됩니다.

  2. 목록을 스크롤하여 데이터세트의 테이블을 확인합니다. 테이블과 뷰는 서로 다른 아이콘으로 구분됩니다.

    테이블 보기

명령줄

bq ls 명령어를 실행합니다. --format 플래그를 사용하여 출력을 제어할 수 있습니다. 기본 프로젝트가 아닌 다른 프로젝트의 뷰를 나열하려면 프로젝트 ID를 [PROJECT_ID]:[DATASET] 형식으로 데이터세트에 추가합니다.

bq ls --format=pretty [PROJECT_ID]:[DATASET]

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

  • [PROJECT_ID]는 프로젝트 ID입니다.
  • [DATASET]는 데이터세트 이름입니다.

이 명령어를 실행하면 Type 필드에 TABLE 또는 VIEW가 표시됩니다. 예를 들면 다음과 같습니다.

+-------------------------+-------+----------------------+-------------------+
|         tableId         | Type  |        Labels        | Time Partitioning |
+-------------------------+-------+----------------------+-------------------+
| mytable                 | TABLE | department:shipping  |                   |
| myview                  | VIEW  |                      |                   |
+-------------------------+-------+----------------------+-------------------+

예:

다음 명령어를 입력하면 기본 프로젝트의 데이터세트 mydataset에 있는 뷰를 나열합니다.

bq ls --format=pretty mydataset

다음 명령어를 입력하면 myotherproject의 데이터세트 mydataset에 있는 뷰를 나열합니다.

bq ls --format=pretty myotherproject:mydataset

API

API를 사용하여 뷰를 나열하려면 tables.list 메소드를 호출합니다.

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")
ts := client.Dataset(datasetID).Tables(ctx)
for {
	t, err := ts.Next()
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Fprintf(w, "Table: %q\n", t.TableID)
}

Python

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

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_ref = client.dataset('my_dataset')

tables = list(client.list_tables(dataset_ref))  # API request(s)
assert len(tables) == 0

table_ref = dataset.table('my_table')
table = bigquery.Table(table_ref)
client.create_table(table)                  # API request
tables = list(client.list_tables(dataset))  # API request(s)

assert len(tables) == 1
assert tables[0].table_id == 'my_table'

메타 테이블을 사용하여 뷰 메타데이터 가져오기

BigQuery는 메타데이터(예: 데이터세트에 있는 테이블 및 뷰 목록)를 나타내는 콘텐츠가 포함된 특수한 테이블을 제공합니다. 이 '메타 테이블'은 읽기 전용입니다. 데이터세트에 있는 테이블과 뷰에 대한 메타데이터에 액세스하려면 쿼리의 SELECT 문에 __TABLES_SUMMARY__ 메타 테이블을 사용합니다. BigQuery 웹 UI를 사용하거나 명령줄 도구의 bq query 명령어를 사용하거나 jobs.insert API 메소드를 호출하고 쿼리 작업을 구성하여 쿼리를 실행할 수 있습니다.

__TABLES_SUMMARY__ 메타 테이블을 사용하는 쿼리는 다음과 같습니다.

    SELECT [FIELD] FROM [DATASET].__TABLES_SUMMARY__

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

  • DATASET는 데이터세트 이름입니다.
  • FIELD는 다음 중 하나입니다.
설명
project_id 프로젝트 이름입니다.
dataset_id 데이터세트 이름입니다.
table_id 테이블 또는 뷰의 이름입니다.
creation_time 1970년 1월 1일(UTC)부터 테이블 또는 뷰가 생성된 시간까지의 경과 시간(밀리초)입니다.
type 테이블 유형을 나타내는 정수입니다. 일반 테이블은 1이고 뷰는 2입니다.

필수 권한

__TABLES_SUMMARY__ 메타 테이블을 사용하는 쿼리 작업을 실행하려면 bigquery.jobs.create 권한이 있어야 합니다. 다음과 같은 사전 정의된 프로젝트 수준 IAM 역할에는 bigquery.jobs.create 권한이 있습니다.

또한 데이터세트 수준에서 READER 역할을 할당받거나 bigquery.tables.getData 권한을 포함하는 프로젝트 수준 IAM 역할을 할당받아야 합니다. 사전 정의된 프로젝트 수준의 모든 IAM 역할에는 bigquery.user, bigquery.jobUser, bigquery.metadataViewer제외한 bigquery.tables.getData 권한이 포함됩니다.

메타 테이블 제한사항

메타 테이블에는 다음과 같은 제한사항이 적용됩니다.

  • 일반적으로 __TABLES_SUMMARY__는 최대 수천 개의 테이블을 포함하는 데이터세트에서 적정 속도를 지원합니다. 데이터세트가 커질수록 __TABLES_SUMMARY__가 점점 느려지고 사용할 수 있는 리소스를 초과할 수 있습니다.
  • tables.insert 메소드에서는 메타 테이블을 사용할 수 없습니다.
  • 메타 테이블을 대상 테이블로 사용할 수 없습니다.
  • 메타 테이블은 이전 SQL의 테이블 데코레이터를 지원하지 않습니다.
  • 데이터세트의 테이블 나열 시 메타 테이블은 나타나지 않습니다.

메타 테이블 예

다음 쿼리는 bigquery-public-data.samples 데이터세트의 모든 메타데이터를 가져옵니다.

웹 UI

#standardSQL
SELECT
  *
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`

명령줄

bq --location=US query --use_legacy_sql=false '
SELECT
  *
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`'

출력은 다음과 같이 표시됩니다.

+----------------------+------------+-----------------+---------------+------+
| project_id           | dataset_id |    table_id     | creation_time | type |
+----------------------+------------+-----------------+---------------+------+
| bigquery-public-data | samples    | github_nested   | 1348782587310 |    1 |
| bigquery-public-data | samples    | github_timeline | 1335915950690 |    1 |
| bigquery-public-data | samples    | gsod            | 1335916040125 |    1 |
| bigquery-public-data | samples    | natality        | 1335916045005 |    1 |
| bigquery-public-data | samples    | shakespeare     | 1335916045099 |    1 |
| bigquery-public-data | samples    | trigrams        | 1335916127449 |    1 |
| bigquery-public-data | samples    | wikipedia       | 1335916132870 |    1 |
+----------------------+------------+-----------------+---------------+------+

다음 쿼리는 bigquery-public-data.samples 데이터세트에 있는 모든 테이블과 뷰를 나열합니다.

웹 UI

#standardSQL
SELECT
  table_id
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`

명령줄

bq --location=US query --use_legacy_sql=false '
SELECT
  table_id
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`'

출력은 다음과 같이 표시됩니다.

+-----------------+
|    table_id     |
+-----------------+
| github_nested   |
| github_timeline |
| gsod            |
| natality        |
| shakespeare     |
| trigrams        |
| wikipedia       |
+-----------------+

다음 쿼리는 bigquery-public-data.samples 데이터세트에 있는 각 테이블의 유형을 나열합니다.

웹 UI

#standardSQL
SELECT
  table_id, type
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`

명령줄

bq --location=US query --use_legacy_sql=false '
SELECT
  table_id, type
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`'

출력은 다음과 같이 표시됩니다.

+-----------------+------+
|    table_id     | type |
+-----------------+------+
| github_nested   |   1  |
| github_timeline |   1  |
| gsod            |   1  |
| natality        |   1  |
| shakespeare     |   1  |
| trigrams        |   1  |
| wikipedia       |   1  |
+-----------------+------+

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

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

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

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

필수 권한

데이터세트에 대한 뷰 액세스 권한을 부여하려면 데이터세트 수준에서 OWNER 액세스 권한을 가지고 있거나 bigquery.datasets.update 권한이 있는 프로젝트 수준 IAM 역할을 할당 받아야 합니다. 사전 정의된 프로젝트 수준의 다음 IAM 역할에는 bigquery.datasets.update 권한이 포함되어 있습니다.

또한 bigquery.user 역할에는 bigquery.datasets.create 권한이 있으므로 bigquery.user 역할에 할당된 사용자는 만드는 모든 데이터세트를 업데이트할 수 있습니다. bigquery.user 역할이 할당된 사용자가 데이터세트를 만들면 이 사용자에게 데이터세트에 대한 OWNER 액세스 권한이 부여됩니다. 데이터세트에 대한 OWNER 액세스 권한은 사용자에게 전체 제어 권한을 부여합니다.

BigQuery의 IAM 역할 및 권한에 대한 자세한 내용은 액세스 제어를 참조하세요. 데이터세트 수준 역할에 대한 자세한 내용은 데이터세트 기본 역할을 참조하세요.

뷰 액세스 권한 부여

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

웹 UI

이 절차에서는 기본 BigQuery 웹 UI를 사용하여 데이터세트에 액세스 제어를 할당하는 방법을 보여줍니다. 현재 BigQuery 웹 UI로는 액세스 제어를 할당할 수 없습니다.
  1. 소스 테이블을 포함한 데이터세트 오른쪽에 있는 드롭다운 화살표를 클릭하고 데이터세트 공유를 선택합니다.

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

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

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

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

      승인된 뷰 선택

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

명령줄

  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 필드에 저장됩니다.

#standardSQL
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 쿼리는 다음과 같습니다.

#standardSQL
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

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

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

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