Funções autorizadas
Funções autorizadas permitem compartilhar resultados de consulta com determinados usuários ou grupos sem conceder a eles acesso às tabelas subjacentes. Por exemplo, uma função 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 uma função definida pelo usuário (UDF, na sigla em inglês) ou uma função de tabela consultar uma tabela, um usuário que invocar essa função precisará ter permissão 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.
Autorizar uma funçã
É possível autorizar UDFs e funções de tabela. Para autorizar uma função, use o Console do Google Cloud, a API REST ou a ferramenta de linha de comando bq
:
Console
Acesse a página do BigQuery no console do Google Cloud.
Na seção Recursos do painel de navegação, amplie o projeto e selecione um conjunto de dados.
No painel de detalhes, clique em Autorizar rotinas.
Na página Rotinas autorizadas, na seção Autorizar rotina, selecione o ID do projeto, o conjunto de dados e o ID da rotina da função que você quer autorizar.
Clique em Adicionar autorização.
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 função.
Chame o método
dataset.update
com a representaçãoDataset
modificada.
bq
Use o comando
bq show
para a representação JSON do conjunto de dados que você quer que a função 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 ao qual a função terá acesso.
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 função.
- PROJECT_ID é o ID do projeto que contém a função.
- ROUTINE_NAME é o nome da função.
Use o comando
bq update
para atualizar o conjunto de dados.bq update --source dataset.json TARGET_DATASET
Exemplo de função 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 comandoshow
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 comandoupdate
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');