승인된 루틴

승인된 루틴을 사용하면 결과를 생성한 기본 테이블에 대해 액세스 권한을 부여하지 않고도 특정 사용자 또는 그룹에 쿼리 결과를 공유할 수 있습니다. 예를 들어 승인된 루틴은 데이터에 대한 집계를 계산하거나 테이블 값을 조회하고 이 값을 계산에 사용할 수 있습니다.

기본적으로 사용자가 루틴을 호출할 경우 사용자에게 테이블 데이터를 읽을 수 있는 액세스 권한이 있어야 합니다. 또는 참조된 테이블이 포함된 데이터 세트에 루틴이 액세스하도록 승인할 수 있습니다. 루틴을 호출하는 사용자가 테이블을 직접 쿼리할 수 없더라도 승인된 루틴은 데이터 세트의 테이블을 쿼리할 수 있습니다.

다음 유형의 루틴을 승인할 수 있습니다.

루틴 승인

루틴을 승인하려면 Google Cloud 콘솔, bq 명령줄 도구, REST API를 사용합니다.

콘솔

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 탐색 패널의 탐색기 섹션에서 프로젝트를 펼치고 데이터 세트를 선택합니다.

  3. 세부정보 패널에서 공유를 펼친 후 루틴 승인을 클릭합니다.

  4. 승인된 루틴 페이지의 루틴 승인 섹션에서 승인하려는 루틴의 프로젝트, 데이터 세트, 루틴을 선택합니다.

  5. 승인 추가를 클릭합니다.

bq

  1. bq show 명령어를 사용하여 루틴이 액세스할 데이터 세트의 JSON 표현을 가져옵니다. 이 명령어의 출력은 Dataset 리소스의 JSON 표현입니다. 결과를 로컬 파일에 저장합니다.

    bq show --format=prettyjson TARGET_DATASET > dataset.json

    TARGET_DATASET를 루틴이 액세스할 수 있는 데이터 세트의 이름으로 바꿉니다.

  2. 파일을 편집하여 다음 JSON 객체를 Dataset 리소스의 access 배열에 추가합니다.

    {
     "routine": {
       "datasetId": "DATASET_NAME",
       "projectId": "PROJECT_ID",
       "routineId": "ROUTINE_NAME"
     }
    }

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

    • DATASET_NAME: 루틴이 포함된 데이터 세트의 이름
    • PROJECT_ID: 루틴이 포함된 프로젝트의 프로젝트 ID
    • ROUTINE_NAME: 루틴의 이름
  3. bq update 명령어를 사용하여 데이터 세트를 업데이트합니다.

    bq update --source dataset.json TARGET_DATASET

API

  1. datasets.get 메서드를 호출하여 루틴이 액세스할 데이터 세트를 가져옵니다. 응답 본문에는 Dataset 리소스의 표현이 포함됩니다.

  2. 다음 JSON 객체를 Dataset 리소스의 access 배열에 추가합니다.

    {
     "routine": {
       "datasetId": "DATASET_NAME",
       "projectId": "PROJECT_ID",
       "routineId": "ROUTINE_NAME"
     }
    }

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

    • DATASET_NAME: UDF가 포함된 데이터 세트의 이름
    • PROJECT_ID: UDF가 포함된 프로젝트의 프로젝트 ID
    • ROUTINE_NAME: 루틴의 이름
  3. 수정된 Dataset 표현을 사용하여 dataset.update 메서드를 호출합니다.

할당량 및 한도

승인된 루틴에는 데이터 세트 한도가 적용됩니다. 자세한 내용은 데이터 세트 한도를 참조하세요.

승인된 루틴 예시

다음은 승인된 UDF를 만들고 사용하는 엔드 투 엔드 예시입니다.

  1. private_datasetpublic_dataset라는 데이터 세트 두 개를 만듭니다. 데이터 세트를 만드는 방법에 대한 자세한 내용은 데이터 세트 만들기를 참조하세요.

  2. 다음 문을 실행하여 private_datasetprivate_table이라는 테이블을 만듭니다

    CREATE OR REPLACE TABLE private_dataset.private_table
    AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
    
  3. 다음 문을 실행하여 public_datasetcount_key이라는 UDF를 만듭니다. UDF는 private_tableSELECT 문을 포함합니다.

    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));
    
  4. public_dataset 데이터 세트에서 사용자에게 bigquery.dataViewer 역할을 부여합니다. 이 역할에는 사용자가 루틴을 호출할 수 있는 bigquery.routines.get 권한이 포함되어 있습니다. 데이터 세트에 액세스 제어를 할당하는 방법은 데이터 세트에 대한 액세스 제어를 참조하세요.

  5. 이때 사용자는 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.
    
  6. bq 명령줄 도구를 사용하여 다음과 같이 show 명령어를 실행합니다.

    bq show --format=prettyjson private_dataset > dataset.json

    출력은 dataset.json이라는 로컬 파일에 저장됩니다.

  7. dataset.json을 수정하여 다음 JSON 객체를 access 배열에 추가합니다.

    {
     "routine": {
       "datasetId": "public_dataset",
       "projectId": "PROJECT_ID",
       "routineId": "count_key"
     }
    }

    PROJECT_IDpublic_dataset의 프로젝트 ID로 바꿉니다.

  8. bq 명령줄 도구를 사용하여 다음과 같이 update 명령어를 실행합니다.

    bq update --source dataset.json private_dataset
  9. UDF가 private_dataset에 액세스했는지 확인하려면 사용자가 다음 쿼리를 실행하면 됩니다.

    SELECT public_dataset.count_key('key1');