Rotinas autorizadas

Com as rotinas autorizadas, é possível compartilhar resultados de consulta com usuários ou grupos específicos sem conceder acesso direto às tabelas subjacentes. Por exemplo, uma rotina pode calcular agregações ou procurar um valor de tabela e usá-lo em um cálculo.

Por padrão, para executar uma rotina, os usuários precisam ter acesso de leitura aos dados referenciados. Como alternativa, é possível autorizar a rotina a acessar diretamente o conjunto de dados que a contém, o que permite que os usuários executem a rotina sem permissões no nível da tabela. É possível autorizar funções de tabela, funções definidas pelo usuário (UDFs) e procedimentos armazenados.

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. No painel à esquerda, clique em Explorer:

    Botão destacado para o painel "Explorer".

    Se o painel esquerdo não aparecer, clique em Expandir painel esquerdo para abrir.

  3. No painel Explorer, expanda o projeto, clique em Conjuntos de dados e selecione um conjunto de dados.

  4. No painel de detalhes, clique em Compartilhar > Autorizar rotinas.

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

  6. 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"
     }
    }

    Substitua:

    • DATASET_NAME: o nome do conjunto de dados que contém a rotina.
    • PROJECT_ID: o ID do projeto que contém a rotina.
    • ROUTINE_NAME: o nome da rotina.
  3. Opcional: se você estiver autorizando um procedimento armazenado, anexe um papel do IAM. Esse papel restringe o acesso à rotina autorizada com base nas permissões dela. Para fazer isso, adicione "role" ao objeto JSON:

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

    Substitua ROLE_NAME pelo nome do papel que você quer anexar. É possível anexar os seguintes papéis a um procedimento armazenado:

  4. 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"
     }
    }

    Substitua:

    • 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. Opcional: se você estiver autorizando um procedimento armazenado, anexe um papel do IAM. Esse papel restringe o acesso ao procedimento autorizado com base nas permissões dele. Para fazer isso, adicione "role" ao objeto JSON:

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

    Substitua ROLE_NAME pelo nome do papel que você quer anexar. É possível anexar os seguintes papéis a um procedimento armazenado:

  4. 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.

Se você atualizar uma rotina, a autorização das rotinas autorizadas atuais vai expirar. O BigQuery remove automaticamente as entradas de autorização de rotinas autorizadas desatualizadas em até 24 horas. Para atualizar as entradas imediatamente, exclua manualmente a entrada da lista "Rotinas autorizadas no momento" antes de autorizá-la novamente.

Limitações

Não é possível criar uma rotina autorizada em uma réplica secundária. Para mais informações, consulte Comportamento de recursos na replicação de conjuntos 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 Trabalhar com controles de 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');