승인된 루틴
승인된 루틴을 사용하면 결과를 생성한 기본 테이블에 대해 액세스 권한을 부여하지 않고도 특정 사용자 또는 그룹에 쿼리 결과를 공유할 수 있습니다. 예를 들어 승인된 루틴은 데이터에 대한 집계를 계산하거나 테이블 값을 조회하고 이 값을 계산에 사용할 수 있습니다.
기본적으로 사용자가 루틴을 호출할 경우 사용자에게 테이블 데이터를 읽을 수 있는 액세스 권한이 있어야 합니다. 또는 참조된 테이블이 포함된 데이터 세트에 루틴이 액세스하도록 승인할 수 있습니다. 루틴을 호출하는 사용자가 테이블을 직접 쿼리할 수 없더라도 승인된 루틴은 데이터 세트의 테이블을 쿼리할 수 있습니다.
다음 유형의 루틴을 승인할 수 있습니다.
루틴 승인
루틴을 승인하려면 Google Cloud 콘솔, bq 명령줄 도구 또는 REST API를 사용합니다.
콘솔
Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
왼쪽 창에서 탐색기를 클릭합니다.

왼쪽 창이 표시되지 않으면 왼쪽 창 펼치기를 클릭하여 창을 엽니다.
탐색기 창에서 프로젝트를 펼치고 데이터 세트를 클릭한 후 데이터 세트를 선택합니다.
세부정보 창에서 공유 > 루틴 승인을 클릭합니다.
승인된 루틴 페이지의 루틴 승인 섹션에서 승인하려는 루틴의 프로젝트, 데이터 세트, 루틴을 선택합니다.
승인 추가를 클릭합니다.
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: 루틴의 이름
선택사항: 저장 프로시저를 승인하는 경우 IAM 역할을 연결합니다. 이 역할은 권한에 따라 승인된 절차에 대한 액세스를 제한합니다. 이렇게 하려면 JSON 객체에
"role"을 추가합니다.{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
ROLE_NAME을 연결하려는 역할의 이름으로 바꿉니다. 저장 프로시저에 다음 역할을 연결할 수 있습니다.- BigQuery 루틴 메타데이터 뷰어 (
roles/bigquery.routineMetadataViewer) - BigQuery 루틴 데이터 뷰어 (
roles/bigquery.routineDataViewer) - BigQuery 루틴 데이터 편집자 (
roles/bigquery.routineDataEditor) - BigQuery 루틴 관리자 (
roles/bigquery.routineAdmin)
- BigQuery 루틴 메타데이터 뷰어 (
bq update명령어를 사용하여 데이터 세트를 업데이트합니다.bq update --source dataset.json TARGET_DATASET
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: 루틴의 이름
선택사항: 저장 프로시져를 승인하는 경우 IAM 역할을 연결합니다. 이 역할은 권한에 따라 승인된 절차에 대한 액세스를 제한합니다. 이렇게 하려면 JSON 객체에
"role"를 추가합니다.{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
ROLE_NAME을 연결할 역할의 이름으로 바꿉니다. 저장 프로시저에 다음 역할을 연결할 수 있습니다.- BigQuery 루틴 메타데이터 뷰어 (
roles/bigquery.routineMetadataViewer) - BigQuery 루틴 데이터 뷰어 (
roles/bigquery.routineDataViewer) - BigQuery 루틴 데이터 편집자 (
roles/bigquery.routineDataEditor) - BigQuery 루틴 관리자 (
roles/bigquery.routineAdmin)
- BigQuery 루틴 메타데이터 뷰어 (
수정된
Dataset표현을 사용하여dataset.update메서드를 호출합니다.
할당량 및 한도
승인된 루틴에는 데이터 세트 한도가 적용됩니다. 자세한 내용은 데이터 세트 한도를 참조하세요.
루틴을 업데이트하면 기존 승인된 루틴 승인이 만료됩니다. BigQuery는 24시간 이내에 오래된 승인된 루틴 승인 항목을 자동으로 삭제합니다. 항목을 즉시 업데이트하려면 다시 승인하기 전에 '현재 승인된 루틴' 목록에서 항목을 수동으로 삭제해야 합니다.
승인된 루틴 예시
다음은 승인된 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');