승인된 함수
승인된 함수를 사용하면 지정된 사용자나 그룹에 기본 테이블에 대한 액세스 권한을 부여하지 않고도 특정 사용자 또는 그룹과 쿼리 결과를 공유할 수 있습니다. 예를 들어 승인된 함수는 데이터에 대한 집계를 계산하거나 테이블 값을 조회하고 이 값을 계산에 사용할 수 있습니다.
기본적으로 사용자 정의 함수(UDF) 또는 테이블 함수가 테이블을 쿼리하는 경우 이 함수를 호출하는 사용자는 테이블의 데이터를 읽을 수 있는 권한이 있어야 합니다. 또는 함수에서 참조된 테이블이 포함된 데이터 세트에 액세스하도록 승인할 수 있습니다. 함수를 호출하는 사용자가 테이블을 직접 쿼리할 수 없더라도 승인된 함수는 데이터 세트의 테이블을 쿼리할 수 있습니다.
함수 승인
UDF와 테이블 함수를 모두 승인할 수 있습니다. Google Cloud Console, REST API, bq
명령줄 도구를 사용하여 함수를 승인할 수 있습니다.
Console
Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
탐색 패널의 리소스 섹션에서 프로젝트를 펼치고 데이터 세트를 선택합니다.
세부정보 패널에서 루틴 승인을 클릭합니다.
승인된 루틴 페이지의 루틴 승인 섹션에서 승인하고자 하는 함수의 프로젝트 ID, 데이터 세트 ID, 루틴 ID를 선택합니다.
승인 추가를 클릭합니다.
API
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
메서드를 호출합니다.
bq
bq show
명령어를 사용하여 함수에서 액세스할 데이터 세트의 JSON 표현을 가져옵니다. 이 명령어의 출력은Dataset
리소스의 JSON 표현입니다. 결과를 로컬 파일에 저장합니다.bq show --format=prettyjson TARGET_DATASET > dataset.json
TARGET_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
승인된 함수 예시
다음은 승인된 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');