승인된 루틴
승인된 루틴을 사용하면 결과를 생성한 기본 테이블에 대해 액세스 권한을 부여하지 않고도 특정 사용자 또는 그룹에 쿼리 결과를 공유할 수 있습니다. 예를 들어 승인된 루틴은 데이터에 대한 집계를 계산하거나 테이블 값을 조회하고 이 값을 계산에 사용할 수 있습니다.
기본적으로 사용자가 루틴을 호출할 경우 사용자에게 테이블 데이터를 읽을 수 있는 액세스 권한이 있어야 합니다. 또는 참조된 테이블이 포함된 데이터 세트에 루틴이 액세스하도록 승인할 수 있습니다. 루틴을 호출하는 사용자가 테이블을 직접 쿼리할 수 없더라도 승인된 루틴은 데이터 세트의 테이블을 쿼리할 수 있습니다.
다음 유형의 루틴을 승인할 수 있습니다.
루틴 승인
루틴을 승인하려면 Google Cloud 콘솔, bq 명령줄 도구, REST API를 사용합니다.
Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
탐색 패널의 탐색기 섹션에서 프로젝트를 펼치고 데이터 세트를 선택합니다.
세부정보 패널에서 공유를 펼친 후 루틴 승인을 클릭합니다.
승인된 루틴 페이지의 루틴 승인 섹션에서 승인하려는 루틴의 프로젝트, 데이터 세트, 루틴을 선택합니다.
승인 추가를 클릭합니다.
bq show
명령어를 사용하여 루틴이 액세스할 데이터 세트의 JSON 표현을 가져옵니다. 이 명령어의 출력은Dataset
리소스의 JSON 표현입니다. 결과를 로컬 파일에 저장합니다.bq show --format=prettyjson
TARGET_DATASET > dataset.jsonTARGET_DATASET를 루틴이 액세스할 수 있는 데이터 세트의 이름으로 바꿉니다.
파일을 편집하여 다음 JSON 객체를
Dataset
리소스의access
배열에 추가합니다.{ "routine": { "datasetId": "
DATASET_NAME ", "projectId": "PROJECT_ID ", "routineId": "ROUTINE_NAME " } }각 항목의 의미는 다음과 같습니다.
- DATASET_NAME: 루틴이 포함된 데이터 세트의 이름
- PROJECT_ID: 루틴이 포함된 프로젝트의 프로젝트 ID
- ROUTINE_NAME: 루틴의 이름
bq update
명령어를 사용하여 데이터 세트를 업데이트합니다.bq update --source dataset.json
TARGET_DATASET
datasets.get
메서드를 호출하여 루틴이 액세스할 데이터 세트를 가져옵니다. 응답 본문에는Dataset
리소스의 표현이 포함됩니다.다음 JSON 객체를
Dataset
리소스의access
배열에 추가합니다.{ "routine": { "datasetId": "
DATASET_NAME ", "projectId": "PROJECT_ID ", "routineId": "ROUTINE_NAME " } }각 항목의 의미는 다음과 같습니다.
- DATASET_NAME: UDF가 포함된 데이터 세트의 이름
- PROJECT_ID: UDF가 포함된 프로젝트의 프로젝트 ID
- ROUTINE_NAME: 루틴의 이름
수정된
Dataset
표현을 사용하여dataset.update
메서드를 호출합니다.
할당량 및 한도
승인된 루틴에는 데이터 세트 한도가 적용됩니다. 자세한 내용은 데이터 세트 한도를 참조하세요.
승인된 루틴 예시
다음은 승인된 UDF를 만들고 사용하는 엔드 투 엔드 예시입니다.
private_dataset
와public_dataset
라는 데이터 세트 두 개를 만듭니다. 데이터 세트를 만드는 방법에 대한 자세한 내용은 데이터 세트 만들기를 참조하세요.다음 문을 실행하여
private_dataset
에private_table
이라는 테이블을 만듭니다CREATE OR REPLACE TABLE private_dataset.private_table AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
다음 문을 실행하여
public_dataset
에count_key
이라는 UDF를 만듭니다. UDF는private_table
에SELECT
문을 포함합니다.CREATE OR REPLACE FUNCTION public_dataset.count_key(input_key STRING) RETURNS INT64 AS ((SELECT COUNT(1) FROM private_dataset.private_table t WHERE t.key = input_key));
public_dataset
데이터 세트에서 사용자에게bigquery.dataViewer
역할을 부여합니다. 이 역할에는 사용자가 루틴을 호출할 수 있는bigquery.routines.get
권한이 포함되어 있습니다. 데이터 세트에 액세스 제어를 할당하는 방법은 데이터 세트에 대한 액세스 제어를 참조하세요.이때 사용자는
count_key
루틴을 호출할 수 있는 권한을 가지고 있지만private_dataset
의 테이블에 액세스할 수 없습니다. 사용자가 루틴을 호출하려고 하면 다음과 비슷한 오류 메시지가 표시됩니다.Access Denied: Table myproject:private_dataset.private_table: User does not have permission to query table myproject:private_dataset.private_table.
bq 명령줄 도구를 사용하여 다음과 같이
show
명령어를 실행합니다.bq show --format=prettyjson private_dataset > dataset.json
출력은
dataset.json
이라는 로컬 파일에 저장됩니다.dataset.json
을 수정하여 다음 JSON 객체를access
배열에 추가합니다.{ "routine": { "datasetId": "public_dataset", "projectId": "
PROJECT_ID ", "routineId": "count_key" } }PROJECT_ID를
public_dataset
의 프로젝트 ID로 바꿉니다.bq 명령줄 도구를 사용하여 다음과 같이
update
명령어를 실행합니다.bq update --source dataset.json private_dataset
UDF가
private_dataset
에 액세스했는지 확인하려면 사용자가 다음 쿼리를 실행하면 됩니다.SELECT public_dataset.count_key('key1');