在这个问题中:How do I use row-level permissions in BigQuery?它描述了如何使用授权视图仅授予对表的一部分的访问权限。但是我想让不同的用户访问不同的行。这是否意味着我需要为每个用户创建单独的视图?有更简单的方法吗?
答案 0 :(得分:14)
令人高兴的是,如果您希望为不同的用户提供对表中不同行的访问权限,则无需为每个用户创建单独的视图。你有几个选择。
这些选项都使用BigQuery中的CURRENT_USER()
函数,该函数返回当前正在运行的用户的电子邮件地址。例如,如果我运行:
SELECT CURRENT_USER()
我回来了tigani@google.com
。
然后,用于向不同用户显示不同行的最简单选项是向表中添加另一列,该列是允许查看该行的用户。例如,架构:{customer:string, id:integer}
将变为{customer:string, id:integer, allowed_viewer: string}
。然后你可以定义一个视图:
SELECT customer, id
FROM private.customers
WHERE allowed_viewer = CURRENT_USER()
(注意,不要忘记按照here所述授权视图。 然后,我只能看到tigani@google.com是allowed_viewer列中值的字段。
然而,这种方法有其自身的缺点;您一次只能授予对单个用户的访问权限。一种选择是使allowed_viewer列成为重复字段;这将允许您提供每行的用户列表。
但是,这仍然是非常严格的限制,并且需要大量记录哪些用户应该有权访问哪一行。机会是,您真正想做的是指定一个小组。因此,您的架构如下所示:{customer:string, id:integer, allowed_group: string}
,allowed_group中的任何人都可以看到您的表格。
您可以通过另一个包含组映射的表来完成此工作。该表格如下:{group:string, user_name:string}
。行可能如下所示:
{engineers, tigani@google.com}
{engineers, some_engineer@google.com}
{administrators, some_admin@google.com}
{sales, some_salesperson@google.com}
...
我们称这个表为private.access_control
。然后我们可以改变我们的视图定义:
SELECT c.customer, c.id
FROM private.customers c
INNER JOIN (
SELECT group
FROM private.access_control
WHERE CURRENT_USER() = user_name) g
ON c.allowed_group = g.group
(请注意,您需要确保private.access_control中没有重复项,否则可能会在结果中重复记录。)
通过这种方式,您可以与数据表(private.access_control
)分开管理private.customers
中的群组。
你可能还想要一件丢失的东西;组包含其他组的能力。您可以通过执行更复杂的连接来扩展访问控制表中的组(您可能只想考虑执行此操作并保存结果,以便在每次查询主表时保存工作)。