如何在不在 BigQuery 中创建单独视图的情况下让不同的用户访问不同的行?
How do I give different users access to different rows without creating separate views in BigQuery?
在这个问题中: 它描述了如何使用授权视图来授予对 table 的一部分的访问权限。但我想让不同的用户访问不同的行。这是否意味着我需要为每个用户创建单独的视图?有没有更简单的方法?
幸运的是,如果您想让不同的用户访问您 table 中的不同行,则无需为每个用户创建单独的视图。你有几个选择。
这些选项都使用 BigQuery 中的 SESSION_USER()
函数,其中 returns 当前 运行ning 用户的电子邮件地址。例如,如果我 运行:
SELECT SESSION_USER()
我回来了tigani@google.com
。
然后,要向不同的用户显示不同的行,最简单的选择是向您的 table 添加另一列,即允许查看该行的用户。例如,架构:{customer:string, id:integer}
将变为 {customer:string, id:integer, allowed_viewer: string}
。然后你可以定义一个视图:
#standardSQL
SELECT customer, id
FROM private.customers
WHERE allowed_viewer = SESSION_USER()
(请注意,不要忘记按照 所述授权视图)。
然后我将只能看到 allowed_viewer 列中的值为 tigani@google.com 的字段。
但是,这种方法有其自身的缺点;您一次只能向一个用户授予访问权限。一种选择是使 allowed_viewer 列成为重复字段;这样您就可以为每一行提供一个用户列表。
然而,这仍然是非常有限制的,并且需要大量的簿记来确定哪些用户应该有权访问哪一行。很有可能,您真正想做的是指定一个组。所以你的架构看起来像:{customer:string, id:integer, allowed_group: string}
,allowed_group 中的任何人都可以看到你的 table.
您可以通过另一个具有您的组映射的 table 来完成这项工作。 table 看起来像:{group:string, user_name:string}
。这些行可能如下所示:
{engineers, tigani@google.com}
{engineers, some_engineer@google.com}
{administrators, some_admin@google.com}
{sales, some_salesperson@google.com}
...
我们称之为 table 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
中的组与数据table分开管理(private.customers
)。
还缺少一件您可能想要的;组包含其他组的能力。您可以通过执行更复杂的连接来扩展访问控制 table 中的组来实现这一点(您可能想考虑只执行一次并保存结果,以在每次主 table 时保存工作]被查询)。
在这个问题中:
幸运的是,如果您想让不同的用户访问您 table 中的不同行,则无需为每个用户创建单独的视图。你有几个选择。
这些选项都使用 BigQuery 中的 SESSION_USER()
函数,其中 returns 当前 运行ning 用户的电子邮件地址。例如,如果我 运行:
SELECT SESSION_USER()
我回来了tigani@google.com
。
然后,要向不同的用户显示不同的行,最简单的选择是向您的 table 添加另一列,即允许查看该行的用户。例如,架构:{customer:string, id:integer}
将变为 {customer:string, id:integer, allowed_viewer: string}
。然后你可以定义一个视图:
#standardSQL
SELECT customer, id
FROM private.customers
WHERE allowed_viewer = SESSION_USER()
(请注意,不要忘记按照
但是,这种方法有其自身的缺点;您一次只能向一个用户授予访问权限。一种选择是使 allowed_viewer 列成为重复字段;这样您就可以为每一行提供一个用户列表。
然而,这仍然是非常有限制的,并且需要大量的簿记来确定哪些用户应该有权访问哪一行。很有可能,您真正想做的是指定一个组。所以你的架构看起来像:{customer:string, id:integer, allowed_group: string}
,allowed_group 中的任何人都可以看到你的 table.
您可以通过另一个具有您的组映射的 table 来完成这项工作。 table 看起来像:{group:string, user_name:string}
。这些行可能如下所示:
{engineers, tigani@google.com}
{engineers, some_engineer@google.com}
{administrators, some_admin@google.com}
{sales, some_salesperson@google.com}
...
我们称之为 table 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
中的组与数据table分开管理(private.customers
)。
还缺少一件您可能想要的;组包含其他组的能力。您可以通过执行更复杂的连接来扩展访问控制 table 中的组来实现这一点(您可能想考虑只执行一次并保存结果,以在每次主 table 时保存工作]被查询)。