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
Acesse a página do BigQuery no console do Google Cloud .
No painel à esquerda, clique em Explorer:

Se o painel esquerdo não aparecer, clique em Expandir painel esquerdo para abrir.
No painel Explorer, expanda o projeto, clique em Conjuntos de dados e selecione um conjunto de dados.
No painel de detalhes, clique em Compartilhar > Autorizar rotinas.
Na página Rotinas autorizadas, na seção Autorizar rotina, selecione o Projeto, o Conjunto de dados e a Rotina que você quer autorizar.
Clique em Adicionar autorização.
bq
Use o comando
bq showpara 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 recursoDataset. Salve o resultado em um arquivo local.bq show --format=prettyjson TARGET_DATASET > dataset.json
Substitua
TARGET_DATASETpelo nome do conjunto de dados que a rotina pode acessar.Edite o arquivo para adicionar o seguinte objeto JSON à matriz
accessno recursoDataset:{ "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.
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_NAMEpelo nome do papel que você quer anexar. É possível anexar os seguintes papéis a um procedimento armazenado:- Leitor de metadados de rotina do BigQuery (
roles/bigquery.routineMetadataViewer) - Visualizador de dados de rotina do BigQuery (
roles/bigquery.routineDataViewer) - Editor de dados de rotina do BigQuery (
roles/bigquery.routineDataEditor) - Administrador de rotinas do BigQuery (
roles/bigquery.routineAdmin)
- Leitor de metadados de rotina do BigQuery (
Use o comando
bq updatepara atualizar o conjunto de dados:bq update --source dataset.json TARGET_DATASET
API
Chame o método
datasets.getpara buscar o conjunto de dados que você quer que a função acesse. O corpo da resposta contém uma representação do recursoDataset.Adicione o seguinte objeto JSON à matriz
accessno recursoDataset:{ "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.
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_NAMEpelo nome do papel que você quer anexar. É possível anexar os seguintes papéis a um procedimento armazenado:- Leitor de metadados de rotina do BigQuery (
roles/bigquery.routineMetadataViewer) - Visualizador de dados de rotina do BigQuery (
roles/bigquery.routineDataViewer) - Editor de dados de rotina do BigQuery (
roles/bigquery.routineDataEditor) - Administrador de rotinas do BigQuery (
roles/bigquery.routineAdmin)
- Leitor de metadados de rotina do BigQuery (
Chame o método
dataset.updatecom a representaçãoDatasetmodificada.
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.
Crie dois conjuntos de dados denominados
private_datasetepublic_dataset. Para mais informações sobre como criar um conjunto de dados, consulte Como criar um conjunto de dados.Execute a seguinte instrução para criar uma tabela chamada
private_tableemprivate_dataset:CREATE OR REPLACE TABLE private_dataset.private_table AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;Execute a seguinte instrução para criar uma UDF denominada
count_keyempublic_dataset. A UDF inclui uma instruçãoSELECTemprivate_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));Conceda o papel
bigquery.dataViewera um usuário no conjunto de dadospublic_dataset. Esse papel inclui a permissãobigquery.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.Neste ponto, o usuário tem permissão para chamar a função
count_key, mas não pode acessar a tabela emprivate_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.
Na ferramenta de linha de comando bq, execute o comando
showda seguinte maneira:bq show --format=prettyjson private_dataset > dataset.json
A saída é salva em um arquivo local chamado
dataset.json.Edite
dataset.jsonpara adicionar o seguinte objeto JSON à matrizaccess:{ "routine": { "datasetId": "public_dataset", "projectId": "PROJECT_ID", "routineId": "count_key" } }
Substitua
PROJECT_IDpelo ID do projetopublic_dataset.Na ferramenta de linha de comando bq, execute o comando
updateda seguinte maneira:bq update --source dataset.json private_dataset
Para verificar se a UDF tem acesso a
private_dataset, o usuário pode executar a seguinte consulta:SELECT public_dataset.count_key('key1');