Google bigquery 如何让不同的用户访问不同的行而不在BigQuery中创建单独的视图?

Google bigquery 如何让不同的用户访问不同的行而不在BigQuery中创建单独的视图?,google-bigquery,Google Bigquery,在这个问题中:它描述了如何使用授权视图只授予对表的一部分的访问权。但是我想让不同的用户访问不同的行。这是否意味着我需要为每个用户创建单独的视图?有更简单的方法吗?幸运的是,如果您想让不同的用户访问表中的不同行,您不需要为每个行创建单独的视图。你有两个选择 这些选项都使用BigQuery中的SESSION\u USER()函数,该函数返回当前运行用户的电子邮件地址。例如,如果我运行: SELECT SESSION_USER() 我回来了tigani@google.com 对于向不同的用户显示不同

在这个问题中:它描述了如何使用授权视图只授予对表的一部分的访问权。但是我想让不同的用户访问不同的行。这是否意味着我需要为每个用户创建单独的视图?有更简单的方法吗?

幸运的是,如果您想让不同的用户访问表中的不同行,您不需要为每个行创建单独的视图。你有两个选择

这些选项都使用BigQuery中的
SESSION\u 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()
(注意,不要忘记按说明授权视图)。 这样我就只能看到tigani@google.com是“允许的\u查看器”列中的值

然而,这种方法有其自身的缺点;一次只能向单个用户授予访问权限。一种选择是将允许的_查看器列设置为重复字段;这将允许您为每一行提供一个用户列表

然而,这仍然是相当严格的,并且需要对哪些用户应该访问哪一行进行大量的簿记。很可能,您真正想做的是指定一个组。因此,您的模式看起来像:
{customer:string,id:integer,allowed_group:string}
,allowed_组中的任何人都可以看到您的表

您可以通过使用另一个具有组映射的表来实现这一点。该表看起来像:
{group:string,user\u name:string}
。这些行可能如下所示:

{engineers, tigani@google.com}
{engineers, some_engineer@google.com}
{administrators, some_admin@google.com}
{sales, some_salesperson@google.com}
...
让我们将此表称为private.access\u 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\u控件中没有重复项,否则可能会导致记录在结果中重复)

通过这种方式,您可以分别从数据表(
private.customers
)管理
private.access\u control
中的组


还有一件你可能想要的东西不见了;组包含其他组的能力。您可以通过做一个更复杂的连接来扩展访问控制表中的组(您可能想考虑只做一次并保存结果,以在每次查询主表时保存工作)。请注意,在新的标准SQL中,函数被称为“代码> SeStudioUsServer())<代码>参见@约旦。为公司外部提供访问权限。