Funções autorizadas

Funções autorizadas permitem compartilhar resultados de consulta com determinados usuários ou grupos sem conceder a eles acesso às tabelas subjacentes. Por exemplo, uma função autorizada pode calcular uma agregação sobre os dados ou procurar um valor de tabela e usá-lo em um cálculo.

Por padrão, se uma função definida pelo usuário (UDF, na sigla em inglês) ou uma função de tabela consultar uma tabela, um usuário que invocar essa função precisará ter permissão para ler os dados na tabela. Se preferir, autorize a função a acessar o conjunto de dados que contém a tabela referenciada. Uma função autorizada pode consultar as tabelas no conjunto de dados, mesmo que o usuário que a chama não possa consultar essas tabelas diretamente.

Autorizar uma funçã

É possível autorizar UDFs e funções de tabela. Para autorizar uma função, use o Console do Google Cloud, a API REST ou a ferramenta de linha de comando bq:

Console

  1. Acesse a página do BigQuery no console do Google Cloud.

    Ir para o BigQuery

  2. Na seção Recursos do painel de navegação, amplie o projeto e selecione um conjunto de dados.

  3. No painel de detalhes, clique em Autorizar rotinas.

  4. Na página Rotinas autorizadas, na seção Autorizar rotina, selecione o ID do projeto, o conjunto de dados e o ID da rotina da função que você quer autorizar.

  5. Clique em Adicionar autorização.

API

  1. Chame o método datasets.get para buscar o conjunto de dados que você quer que a função acesse. O corpo da resposta contém uma representação do recurso Dataset.

  2. Adicione o seguinte objeto JSON à matriz access no recurso Dataset:

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

    Em que:

    • DATASET_NAME é o nome do conjunto de dados que contém a UDF.
    • PROJECT_ID é o ID do projeto que contém a UDF.
    • ROUTINE_NAME é o nome da função.
  3. Chame o método dataset.update com a representação Dataset modificada.

bq

  1. Use o comando bq show para a representação JSON do conjunto de dados que você quer que a função acesse. A saída do comando é uma representação JSON do recurso Dataset. Salve o resultado em um arquivo local.

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

    Substitua TARGET_DATASET pelo nome do conjunto de dados ao qual a função terá acesso.

  2. Edite o arquivo para adicionar o seguinte objeto JSON à matriz access no recurso Dataset:

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

    Em que:

    • DATASET_NAME é o nome do conjunto de dados que contém a função.
    • PROJECT_ID é o ID do projeto que contém a função.
    • ROUTINE_NAME é o nome da função.
  3. Use o comando bq update para atualizar o conjunto de dados.

    bq update --source dataset.json TARGET_DATASET
    

Exemplo de função autorizada

Veja a seguir um exemplo completo de criação e uso de uma UDF autorizada.

  1. Crie dois conjuntos de dados denominados private_dataset e public_dataset. Para mais informações sobre como criar um conjunto de dados, consulte Como criar um conjunto de dados.

  2. Execute a seguinte instrução para criar uma tabela chamada private_table em private_dataset:

    CREATE OR REPLACE TABLE private_dataset.private_table
    AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
    
  3. Execute a seguinte instrução para criar uma UDF denominada count_key em public_dataset. A UDF inclui uma instrução SELECT em private_table.

    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. Conceda o papel bigquery.dataViewer a um usuário no conjunto de dados public_dataset. Esse papel inclui a permissão bigquery.routines.get, que permite ao usuário chamar a função. Para mais informações sobre como atribuir controles de acesso a um conjunto de dados, consulte Como controlar o acesso a conjuntos de dados.

  5. Neste ponto, o usuário tem permissão para chamar a função count_key, mas não pode acessar a tabela em private_dataset. Se o usuário tentar chamar a função, ele receberá uma mensagem de erro semelhante a esta:

    Access Denied: Table myproject:private_dataset.private_table: User does
    not have permission to query table myproject:private_dataset.private_table.
    
  6. Na ferramenta de linha de comando bq, execute o comando show da seguinte maneira:

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

    A saída é salva em um arquivo local chamado dataset.json.

  7. Edite dataset.json para adicionar o seguinte objeto JSON à matriz access:

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

    Substitua PROJECT_ID pelo ID do projeto public_dataset.

  8. Na ferramenta de linha de comando bq, execute o comando update da seguinte maneira:

    bq update --source dataset.json private_dataset
    
  9. Para verificar se a UDF tem acesso a private_dataset, o usuário pode executar a seguinte consulta:

    SELECT public_dataset.count_key('key1');