【发布时间】:2015-06-23 08:57:45
【问题描述】:
在这个问题中:How do I use row-level permissions in BigQuery? 它描述了如何使用授权视图仅授予对表的一部分的访问权限。但我想让不同的用户访问不同的行。这是否意味着我需要为每个用户创建单独的视图?有没有更简单的方法?
【问题讨论】:
标签: google-bigquery
在这个问题中:How do I use row-level permissions in BigQuery? 它描述了如何使用授权视图仅授予对表的一部分的访问权限。但我想让不同的用户访问不同的行。这是否意味着我需要为每个用户创建单独的视图?有没有更简单的方法?
【问题讨论】:
标签: google-bigquery
令人高兴的是,如果您想让不同的用户访问表中的不同行,则无需为每个用户创建单独的视图。你有几个选择。
这些选项都使用 BigQuery 中的 SESSION_USER() 函数,该函数返回当前运行用户的电子邮件地址。例如,如果我运行:
SELECT SESSION_USER()
我回复tigani@google.com。
那么,为了向不同的用户显示不同的行,最简单的选择是在您的表中添加另一列,即允许查看该行的用户。例如,架构:{customer:string, id:integer} 将变为 {customer:string, id:integer, allowed_viewer: string}。然后你可以定义一个视图:
#standardSQL
SELECT customer, id
FROM private.customers
WHERE allowed_viewer = SESSION_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。然后我们可以改变我们的视图定义:
#standardSQL
SELECT c.customer, c.id
FROM private.customers c
INNER JOIN (
SELECT group
FROM private.access_control
WHERE SESSION_USER() = user_name) g
ON c.allowed_group = g.group
(请注意,您需要确保 private.access_control 中没有重复项,否则可能会在结果中重复记录)。
这样,您可以将private.access_control中的组与数据表(private.customers)分开管理。
还有一件你可能想要的;组包含其他组的能力。您可以通过执行更复杂的连接来扩展访问控制表中的组来实现这一点(您可能希望考虑只执行一次并保存结果,以便在每次查询主表时保存工作)。
【讨论】:
SESSION_USER() 参见 cloud.google.com/bigquery/docs/reference/standard-sql/…