You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过查询/Python方法获取BigQuery表中用户可访问列列表?

获取BigQuery中指定用户有权访问的数据表列

可以通过BigQuery内置的信息架构视图或Python结合BigQuery API两种方式实现需求。

一、使用BigQuery查询语句

利用INFORMATION_SCHEMA下的权限视图,可直接查询用户的列级访问权限,包括直接授权和通过角色继承的权限。

1. 查询直接列级权限

如果用户的权限是直接授予到列的,用以下语句:

SELECT
  table_name,
  column_name,
  grantee
FROM
  `[项目ID].[数据集ID].INFORMATION_SCHEMA.COLUMN_PRIVILEGES`
WHERE
  grantee IN ('userA@yourdomain.com', 'userB@yourdomain.com')
  AND table_name = 'TableA'
ORDER BY grantee, column_name;

2. 包含角色继承的完整权限查询

很多场景下用户权限来自角色,需要关联角色授权视图来统计:

WITH user_assigned_roles AS (
  -- 获取用户直接拥有的角色
  SELECT grantee, role_name
  FROM `[项目ID].[数据集ID].INFORMATION_SCHEMA.ROLE_GRANTS`
  WHERE grantee IN ('userA@yourdomain.com', 'userB@yourdomain.com')
  UNION ALL
  -- 获取角色继承的角色(递归查询,这里只做一层,如需多层可扩展)
  SELECT r.grantee, g.role_name
  FROM `[项目ID].[数据集ID].INFORMATION_SCHEMA.ROLE_GRANTS` r
  JOIN `[项目ID].[数据集ID].INFORMATION_SCHEMA.ROLE_GRANTS` g
  ON r.role_name = g.grantee
  WHERE r.grantee IN ('userA@yourdomain.com', 'userB@yourdomain.com')
),
role_column_permissions AS (
  -- 通过角色获取列权限
  SELECT
    cp.table_name,
    cp.column_name,
    ur.grantee
  FROM `[项目ID].[数据集ID].INFORMATION_SCHEMA.COLUMN_PRIVILEGES` cp
  JOIN user_assigned_roles ur ON cp.grantee = ur.role_name
)
-- 合并直接权限和角色权限,去重
SELECT * FROM role_column_permissions
UNION DISTINCT
SELECT table_name, column_name, grantee
FROM `[项目ID].[数据集ID].INFORMATION_SCHEMA.COLUMN_PRIVILEGES`
WHERE grantee IN ('userA@yourdomain.com', 'userB@yourdomain.com')
  AND table_name = 'TableA'
ORDER BY grantee, column_name;

二、使用Python方法

借助google-cloud-bigquery库,通过模拟用户权限执行测试查询的方式,验证用户对每一列的访问权限。

代码示例

from google.cloud import bigquery

def get_user_accessible_columns(project_id, dataset_id, table_name, target_users):
    client = bigquery.Client(project=project_id)
    table_ref = f"{dataset_id}.{table_name}"
    table = client.get_table(table_ref)
    user_columns = {}

    for user in target_users:
        accessible = []
        # 模拟用户身份执行查询(需确保当前账号有模拟权限)
        impersonated_client = bigquery.Client(
            project=project_id,
            impersonated_service_account=user
        )
        for col in table.schema:
            test_query = f"SELECT `{col.name}` FROM `{table_ref}` LIMIT 1"
            try:
                # 执行查询,成功则说明有权限
                impersonated_client.query(test_query).result()
                accessible.append(col.name)
            except Exception:
                # 查询失败,无权限
                pass
        user_columns[user] = accessible
    return user_columns

# 调用示例
result = get_user_accessible_columns(
    "your-project-id",
    "your-dataset",
    "TableA",
    ["userA@yourdomain.com", "userB@yourdomain.com"]
)
for user, cols in result.items():
    print(f"{user} 可访问列: {', '.join(cols)}")

注意:使用此方法时,运行代码的账号需要拥有roles/iam.serviceAccountTokenCreator权限,才能模拟目标用户执行查询。

内容的提问来源于stack exchange,提问作者develop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:50:21