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
Acesse a página do BigQuery no console do Google Cloud.
Na seção Explorer do painel de navegação, expanda seu projeto e selecione um conjunto de dados.
No painel de detalhes, expanda Compartilhamento e clique em 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 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 recursoDataset
. 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.
Edite o arquivo para adicionar o seguinte objeto JSON à matriz
access
no recursoDataset
:{ "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.
Use o comando
bq update
para atualizar o conjunto de dados.bq update --source dataset.json TARGET_DATASET
API
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 recursoDataset
.Adicione o seguinte objeto JSON à matriz
access
no recursoDataset
:{ "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.
Chame o método
dataset.update
com a representaçãoDataset
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.
Crie dois conjuntos de dados denominados
private_dataset
epublic_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_table
emprivate_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_key
empublic_dataset
. A UDF inclui uma instruçãoSELECT
emprivate_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.dataViewer
a 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 Como controlar o 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
show
da seguinte maneira:bq show --format=prettyjson private_dataset > dataset.json
A saída é salva em um arquivo local chamado
dataset.json
.Edite
dataset.json
para adicionar o seguinte objeto JSON à matrizaccess
:{ "routine": { "datasetId": "public_dataset", "projectId": "PROJECT_ID", "routineId": "count_key" } }
Substitua PROJECT_ID pelo ID do projeto
public_dataset
.Na ferramenta de linha de comando bq, execute o comando
update
da 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');