我有一个简单的SQL文本。SELECT COUNT(*) FROM project1.dataset1.table1 t1 INNER JOIN project2.dataset2.table2 t2 ON t2.id = t1.id
只是一个例子。表的布局不是我们关心的。
我也有一个凭证json文件:project1.json包含以下信息:{"type": "service_account", "project_id": "project1", "private_key_id":..., "private_key":...,...}。
所以这是我的代码。
import os
from google.cloud import bigquery
from google.oauth2 import service_account
credentials_json = 'project1.json'
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = credentials_json
credentials = service_account.Credentials.from_service_account_file(
credentials_json,
scopes=['https://www.googleapis.com/auth/cloud-platform']
)
client = bigquery.Client(credentials=credentials)
sql = 'SELECT COUNT(*) AS cnt FROM project1.dataset1.table1 t1 INNER JOIN project2.dataset2.table2 t2 AS t2 ON t2.id = t1.id'
rows = client.query(sql).result()
google.api_core.exceptions.Forbidden: 403 Access Denied: 表project2:dataset2.table2:用户没有权限查询表project2:dataset2.table2。
我应该怎么做才能运行该SQL
每个服务账户都有一个电子邮件地址。首先,获取该邮箱地址。
然后到project2的权限中,添加服务账号的邮箱,以获取BigQuery的权限,如BigQuery Viewer,BigQuery Owner等。
1.进入BigQuery UI中的 云端控制台.
2.选择 project2
从项目的下拉菜单中选择一个项目。
3.选择一个 dataset2
从资源,然后单击 Share dataset
窗口右侧附近的 "服务账户"。
4.在 "共享数据集 "面板中,在 "数据集权限 "选项卡中,输入你要添加到的服务账户。Add members
文本框。
5.对于 Select a role
,选择BigQuery,并为服务账户选择一个合适的预定义IAM角色。例如,选择BigQuery,并为服务账户选择适当的预定义IAM角色。Viewer
为只读访问。
这个过程记录在案的是 此处. 请注意,根据您的权限,您在 project2
你可能需要一个项目负责人或BigQuery管理员来为你执行这些步骤。
如果有必要重复这些步骤 project1.dataset1
虽然根据你得到的错误信息,你可能已经有了该文件的权限。