승인된 뷰 및 구체화된 뷰
이 문서에서는 BigQuery에서 승인된 뷰 및 구체화된 뷰를 만드는 방법을 설명합니다.
승인된 뷰 및 승인되어 구체화된 뷰를 사용하면 기본 소스 데이터에 대한 액세스 권한을 부여하지 않고도 특정 사용자 및 그룹과 쿼리 결과를 공유할 수 있습니다. 뷰 또는 구체화된 뷰에는 사용자가 아닌 데이터에 대한 액세스 권한이 부여됩니다. 또한 뷰 또는 구체화된 뷰를 만드는 SQL 쿼리를 사용하여 사용자가 쿼리할 수 있는 열과 필드를 제한할 수도 있습니다.
다른 데이터 세트에서 승인된 뷰 또는 구체화된 뷰를 만들 때 소스 데이터 세트와 승인된 뷰 데이터 세트는 모두 같은 리전 위치에 있어야 합니다.
개별 뷰를 승인하는 대신 데이터 세트의 모든 뷰를 승인하는 방법에 대한 자세한 내용은 승인된 데이터 세트를 참조하세요.
시작하기 전에
사용자에게 이 문서의 각 작업을 수행하는 데 필요한 권한을 부여하는 Identity and Access Management(IAM) 역할을 부여합니다.
필수 권한
승인된 뷰를 만들거나 업데이트하려면 뷰가 포함 된 데이터 세트와 뷰에 대한 액세스를 제공하는 데이터 세트에 대한 권한이 필요합니다.
뷰가 포함된 데이터 세트에 대한 권한
뷰는 BigQuery에서 테이블 리소스로 취급되므로 뷰를 만들려면 테이블을 만들 때와 동일한 권한이 필요합니다. 뷰의 SQL 쿼리에서 참조하는 모든 테이블을 쿼리할 권한도 필요합니다.
뷰를 만들려면 bigquery.tables.create
IAM 권한이 필요합니다. 사전 정의된 IAM 역할 roles/bigquery.dataEditor
에는 뷰를 만드는 데 필요한 권한이 포함됩니다.
또한 bigquery.datasets.create
권한이 있으면 사용자가 만든 데이터 세트에 뷰를 만들 수 있습니다. 소유하지 않은 데이터의 뷰를 만들려면 해당 테이블에 대한 bigquery.tables.getData
권한이 있어야 합니다.
BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.
뷰에 대한 액세스 권한을 제공하는 데이터 세트에 대한 권한
데이터 세트 속성을 업데이트하려면 다음 IAM 권한이 필요합니다.
bigquery.datasets.update
bigquery.datasets.setIamPolicy
(Google Cloud 콘솔에서 데이터 세트 액세스 제어를 업데이트할 때만 필요)
사전 정의된 roles/bigquery.dataOwner
IAM 역할에는 데이터 세트 속성을 업데이트하는 데 필요한 권한이 포함됩니다.
또한 bigquery.datasets.create
권한이 있으면 만드는 데이터 세트의 속성을 업데이트할 수 있습니다.
BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.
뷰 승인
데이터 세트에 뷰 액세스 권한을 부여하려면 다음 단계를 수행합니다.
콘솔
Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
탐색기 창에서 프로젝트를 확장하고 데이터 세트를 선택합니다.
작업 보기를 클릭한 후 열기를 클릭합니다.
데이터 세트 정보 창에서
공유를 클릭한 후 뷰 승인을 선택합니다.뷰 승인에 승인할 뷰의 이름을 입력합니다.
승인 추가를 클릭합니다.
닫기를 클릭합니다.
bq
bq 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 파일에 씁니다.mydataset
는myotherproject
에 있습니다.bq show --format=prettyjson \ myotherproject:mydataset > /tmp/mydataset.json
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]" } } ], }
수정이 완료되면
bq 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
에 대한 액세스 제어를 업데이트합니다.mydataset
는myotherproject
에 있습니다.bq update --source /tmp/mydataset.json myotherproject:mydataset
액세스 제어 변경사항을 확인하려면 파일에 정보를 쓰지 않고
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 참고 문서를 확인하세요.
BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.
자바
이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 Java 설정 안내를 따르세요. 자세한 내용은 BigQuery Java API 참고 문서를 확인하세요.
BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.
Python
이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참고 문서를 확인하세요.
BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.
뷰에 대한 승인 삭제
뷰에 대한 승인을 삭제하려면 다음 안내를 따르세요.
콘솔
Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
탐색기 창에서 프로젝트를 확장하고 데이터 세트를 선택합니다.
> 뷰 승인을 클릭합니다.
공유승인 삭제를 클릭합니다.
닫기를 클릭합니다.
할당량 및 한도
- 승인된 뷰에는 데이터 세트 한도가 적용됩니다. 자세한 내용은 데이터 세트 한도를 참조하세요.
- 승인된 뷰를 삭제하는 경우 뷰에 대한 모든 참조가 시스템에서 삭제되는 데 최대 24시간이 걸릴 수 있습니다. 오류를 방지하려면 24시간이 지나기를 기다렸다가 삭제된 뷰의 이름을 재사용하거나 뷰에 고유한 이름을 만드세요.
뷰를 사용하여 행 수준의 액세스 권한 지정
뷰를 사용하여 특정 열(필드)에 대한 액세스를 제한할 수 있습니다. 테이블의 개별 행에 대한 액세스를 제한하려는 경우 각 사용자나 그룹에 대해 별도로 뷰를 만들 필요가 없습니다. 대신 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
다음 단계
- 승인된 뷰 만들기에 대한 튜토리얼은 승인된 뷰 만들기 참조하기
- 뷰 만들기에 대한 자세한 내용은 뷰 만들기 참조하기
- 구체화된 뷰 만들기에 대한 자세한 내용은 구체화된 뷰 만들기 참조하기
- 뷰 메타데이터 가져오기에 대한 자세한 내용은 뷰 정보 가져오기 참ㅈㅗ하기
- 뷰 관리에 대한 자세한 내용은 뷰 관리 참조하기
- 데이터 세트의 모든 뷰 승인에 대한 자세한 내용은 승인된 데이터 세트 참조하기