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
Aceda à página do BigQuery na Google Cloud consola.
No painel de navegação, na secção Explorador, expanda o projeto e selecione um conjunto de dados.
No painel de detalhes, expanda Partilha e, de seguida, clique em Autorizar rotinas.
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.
Clique em Adicionar autorização.
bq
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 recursoDataset
. 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.
Edite o ficheiro para adicionar o seguinte objeto JSON à matriz
access
no recursoDataset
:{ "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.
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 obter o conjunto de dados ao qual quer que a rotina aceda. O corpo da resposta contém uma representação do recursoDataset
.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.
Chame o método
dataset.update
com a representaçãoDataset
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.
Crie dois conjuntos de dados denominados
private_dataset
epublic_dataset
. Para mais informações sobre como criar um conjunto de dados, consulte Criar um conjunto de dados.Execute a seguinte declaração para criar uma tabela denominada
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 declaração para criar uma FDU denominada
count_key
empublic_dataset
. A FDU inclui uma declaraçã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 a função de
bigquery.dataViewer
a um utilizador no conjunto de dadospublic_dataset
. Esta função inclui a autorizaçãobigquery.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.Neste ponto, o utilizador tem autorização para chamar a rotina
count_key
, mas não pode aceder à tabela emprivate_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.
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
.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 para
public_dataset
.Com a ferramenta de linhas de comando bq, execute o comando
update
da seguinte forma:bq update --source dataset.json private_dataset
Para verificar se a FDU tem acesso a
private_dataset
, o utilizador pode executar a seguinte consulta:SELECT public_dataset.count_key('key1');