在这个问题中:如何在BigQuery中使用行级权限?它描述了如何使用授权视图仅授予对表的一部分的访问权限.但是我想让不同的用户访问不同的行.这是否意味着我需要为每个用户创建单独的视图?有没有更简单的方法?
Jor*_*ani 14
令人高兴的是,如果要让不同的用户访问表中的不同行,则无需为每个行创建单独的视图.你有几个选择.
这些选项都使用CURRENT_USER()BigQuery 中的函数,该函数返回当前正在运行的用户的电子邮件地址.例如,如果我运行:
SELECT CURRENT_USER()
Run Code Online (Sandbox Code Playgroud)
我回来了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()
Run Code Online (Sandbox Code Playgroud)
(注意,不要忘记授权此处所述的视图).然后,我只能看到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}
...
Run Code Online (Sandbox Code Playgroud)
我们打电话给这张桌子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
Run Code Online (Sandbox Code Playgroud)
(注意,您需要确保private.access_control中没有重复项,否则可能会在结果中重复记录).
通过这种方式,您可以private.access_control与数据表(private.customers)分开管理组.
还有一件你想要的遗失; 组包含其他组的能力.您可以通过执行更复杂的连接来扩展访问控制表中的组(您可能只想考虑执行此操作并保存结果,以便在每次查询主表时保存工作).
| 归档时间: |
|
| 查看次数: |
3832 次 |
| 最近记录: |