Rotinas autorizadas

As rotinas autorizadas permitem compartilhar resultados de consultas com usuários ou grupos específicos sem conceder acesso às tabelas subjacentes que geraram os resultados. Por exemplo, uma rotina 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 um usuário invocar uma rotina, ele precisará ter acesso 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.

Os seguintes tipos de rotinas podem ser autorizados:

Autorizar rotinas

Para autorizar uma rotina, use o console do Google Cloud, a ferramenta de linha de comando bq ou a API REST:

Console

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

    Acessar o BigQuery

  2. Na seção Explorer do painel de navegação, expanda seu projeto e selecione um conjunto de dados.

  3. No painel de detalhes, expanda Compartilhamento e clique em Autorizar rotinas.

  4. Na página Rotinas autorizadas, na seção Autorizar rotina, selecione o Projeto, o Conjunto de dados e a Rotina que você quer autorizar.

  5. Clique em Adicionar autorização.

bq

  1. Use o comando bq show para conseguir a representação JSON do conjunto de dados que você quer que a rotina 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 que a rotina pode acessar.

  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 tabela.
    • PROJECT_ID é o ID do projeto que contém a função.
    • ROUTINE_NAME é o nome da rotina.
  3. Use o comando bq update para atualizar o conjunto de dados.

    bq update --source dataset.json TARGET_DATASET
    

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 rotina.
  3. Chame o método dataset.update com a representação Dataset modificada.

Cotas e limites

As rotinas autorizadas estão sujeitas aos limites do conjunto de dados. Consulte mais informações em Limites do conjunto de dados.

Exemplo de rotina 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');