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 para 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 esquerdo, clique em Explorador:

Se não vir o painel do lado esquerdo, clique em Expandir painel do lado esquerdo para o abrir.
No painel Explorador, expanda o seu projeto, clique em Conjuntos de dados e, de seguida, selecione um conjunto de dados.
No painel de detalhes, clique em Partilhar > 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 showpara 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_DATASETpelo nome do conjunto de dados ao qual a rotina pode aceder.Edite o ficheiro para adicionar o seguinte objeto JSON à matriz
accessno recursoDataset:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Substitua o seguinte:
DATASET_NAME: o nome do conjunto de dados que contém a rotina.PROJECT_ID: o ID do projeto do projeto que contém a rotina.ROUTINE_NAME: o nome da rotina.
Opcional: se estiver a autorizar um procedimento armazenado, anexe uma função do IAM. Esta função restringe o acesso ao procedimento autorizado com base nas respetivas autorizações. Para tal, adicione
"role"ao objeto JSON:{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Substitua
ROLE_NAMEpelo nome da função que quer anexar. Pode anexar as seguintes funções a um procedimento armazenado:- Visualizador de metadados de rotinas do BigQuery (
roles/bigquery.routineMetadataViewer) - Visualizador de dados de rotinas do BigQuery (
roles/bigquery.routineDataViewer) - Editor de dados de rotinas do BigQuery (
roles/bigquery.routineDataEditor) - BigQuery Routine Admin (
roles/bigquery.routineAdmin)
- Visualizador de metadados de rotinas 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 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
accessno recurso:Dataset{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Substitua o seguinte:
DATASET_NAME: o nome do conjunto de dados que contém a FDU.PROJECT_ID: o ID do projeto do projeto que contém a FDU.ROUTINE_NAME: o nome da rotina.
Opcional: se estiver a autorizar um procedimento armazenado, anexe uma função do IAM. Esta função restringe o acesso ao procedimento autorizado com base nas respetivas autorizações. Para isso, adicione
"role"ao objeto JSON:{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
Substitua
ROLE_NAMEpelo nome da função que quer anexar. Pode anexar as seguintes funções a um procedimento armazenado:- Visualizador de metadados de rotinas do BigQuery (
roles/bigquery.routineMetadataViewer) - Visualizador de dados de rotinas do BigQuery (
roles/bigquery.routineDataViewer) - Editor de dados de rotinas do BigQuery (
roles/bigquery.routineDataEditor) - Administrador de rotinas do BigQuery (
roles/bigquery.routineAdmin)
- Visualizador de metadados de rotinas do BigQuery (
Chame o método
dataset.updatecom a representaçãoDatasetmodificada.
Quotas e limites
As rotinas autorizadas estão sujeitas a limites do conjunto 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_datasetepublic_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_tableemprivate_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_keyempublic_dataset. A FDU inclui uma declaraçã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 a função de
bigquery.dataViewera 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
showda seguinte forma:bq show --format=prettyjson private_dataset > dataset.json
O resultado é guardado num ficheiro local denominado
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 projeto parapublic_dataset.Usando a ferramenta de linhas de comando bq, execute o comando
updateda 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');