Rotinas autorizadas

As rotinas autorizadas permitem-lhe partilhar resultados de consultas com utilizadores ou grupos específicos sem lhes conceder acesso às tabelas subjacentes que geraram os resultados. Por exemplo, uma rotina autorizada pode calcular uma agregação sobre dados ou procurar um valor de tabela e usar esse valor num cálculo.

Por predefinição, se um utilizador invocar uma rotina, tem de ter acesso para ler os dados na tabela. Em alternativa, pode autorizar a rotina a aceder ao conjunto de dados que contém a tabela referenciada. Uma rotina autorizada pode consultar as tabelas no conjunto de dados, mesmo que o utilizador que chama a rotina não possa consultar essas tabelas diretamente.

Podem ser autorizados os seguintes tipos de rotinas:

Autorize rotinas

Para autorizar uma rotina, use a Google Cloud consola, a ferramenta de linhas de comando bq ou a API REST:

Consola

  1. Aceda à página do BigQuery na Google Cloud consola.

    Aceda ao BigQuery

  2. No painel de navegação, na secção Explorador, expanda o projeto e selecione um conjunto de dados.

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

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

  5. Clique em Adicionar autorização.

bq

  1. Use o comando bq show para obter a representação JSON do conjunto de dados ao qual quer que a rotina aceda. A saída do comando é uma representação JSON do recurso Dataset. Guarde o resultado num ficheiro local.

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

    Substitua TARGET_DATASET pelo nome do conjunto de dados ao qual a rotina pode aceder.

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

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

    Onde:

    • 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. 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 obter o conjunto de dados ao qual quer que a rotina aceda. 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"
     }
    }

    Onde:

    • DATASET_NAME é o nome do conjunto de dados que contém a FUD.
    • 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.

Quotas e limites

As rotinas autorizadas estão sujeitas a limites de conjuntos de dados. Para mais informações, consulte o artigo Limites do conjunto de dados.

Exemplo de rotina autorizada

Segue-se um exemplo completo da criação e utilização de uma FDU 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 Criar um conjunto de dados.

  2. Execute a seguinte declaração para criar uma tabela denominada 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 declaração para criar uma FDU denominada count_key em public_dataset. A FDU inclui uma declaraçã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 a função de bigquery.dataViewer a um utilizador no conjunto de dados public_dataset. Esta função inclui a autorização bigquery.routines.get, que permite ao utilizador chamar a rotina. Para obter informações sobre como atribuir controlos de acesso a um conjunto de dados, consulte o artigo Controlar o acesso a conjuntos de dados.

  5. Neste ponto, o utilizador tem autorização para chamar a rotina count_key, mas não pode aceder à tabela em private_dataset. Se o utilizador tentar chamar a rotina, recebe uma mensagem de erro semelhante à seguinte:

    Access Denied: Table myproject:private_dataset.private_table: User does
    not have permission to query table myproject:private_dataset.private_table.
    
  6. Com a ferramenta de linhas de comando bq, execute o comando show da seguinte forma:

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

    A saída é guardada num ficheiro local denominado 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 para public_dataset.

  8. Com a ferramenta de linhas de comando bq, execute o comando update da seguinte forma:

    bq update --source dataset.json private_dataset
  9. Para verificar se a FDU tem acesso a private_dataset, o utilizador pode executar a seguinte consulta:

    SELECT public_dataset.count_key('key1');