승인된 함수

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

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

함수 승인

UDF와 테이블 함수를 모두 승인할 수 있습니다. Google Cloud Console, REST API, bq 명령줄 도구를 사용하여 함수를 승인할 수 있습니다.

Console

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

    BigQuery로 이동

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

  3. 세부정보 패널에서 루틴 승인을 클릭합니다.

  4. 승인된 루틴 페이지의 루틴 승인 섹션에서 승인하고자 하는 함수의 프로젝트 ID, 데이터 세트 ID, 루틴 ID를 선택합니다.

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

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 메서드를 호출합니다.

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
    

승인된 함수 예시

다음은 승인된 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');