为什么 BigQuery 策略标记的列在 GROUP BY 语句中使用时会阻止访问其他列?

Why do BigQuery policy tagged columns prevent access to other columns when used in a GROUP BY statement?

我们正在探索使用 BigQuery 策略标记来实现列级安全性。我们发现,当用户无权访问的列包含在 GROUP BY 子句中时,用户也无法访问 GROUP BY 子句中的其他列。

让我用一个人为的例子来解释。假设我们有一个包含两列的 table t

这些列上有政策标签,授予我们的最终用户查看 t.a 中数据的权限,但不能查看 t.b 中的数据。

因此我们的最终用户可以发出此查询:

select a 
from t

但是发出此查询时:

select b 
from t

他们得到一个错误:

Access Denied: BigQuery BigQuery: User does not have permission to access policy tag "policy-tag-name" on column project.dataset.t.b.

这是预期的并且是设计使然。

但是,如果用户发出此查询:

select a 
from (
    select a, b 
    from t 
    group by a, b
)

然后出现同样的错误。

这是为什么?用户未访问任何他们无权访问的数据。我很难理解为什么 group by 语句会导致此错误。谁能赐教一下?

此查询不公开值 b,但如果允许,它会公开有关 b 的一些信息。

例如它让我们知道每个 a 值有多少个不同的 b 值。假设 a 是产品 ID,b 是卖家 ID。查询将显示每个产品有多少个独立的卖家。但是决定隐藏卖家的人可能不希望这样。或者 a 是某个员工组(例如部门或经理 ID),b 是薪水。这个查询会暴露他们是否有相同的薪水。政策阻止了这一点。

请注意,可能存在更复杂的查询,其中引用 b 不会暴露有关 b 的任何信息,但无论如何策略都会阻止它。这也是设计使然 - BigQuery 安全起见,如果它不能证明此类引用不会暴露任何信息,它就会禁止它。