将 BigQuery 表切换为“只读模式”

Posted

技术标签:

【中文标题】将 BigQuery 表切换为“只读模式”【英文标题】:Switching a BigQuery table into "readonly mode" 【发布时间】:2017-11-01 05:44:14 【问题描述】:

我想确保 BigQuery 中的表不能再接收任何插入(无论是“加载/批量”插入还是“流式”插入)。 有没有可能将表格变成“只读模式”?

我想避免使用最小权限级别是数据集级别的标准 IAM/访问控制。如果有一个选项可以为所有用户独立于他们的角色在 1 个表上强制“只读”(就像你强制文件系统处于“只读模式”时一样),那就太棒了。

(最终目标是安全合并“主”表和“更新”表,如下所述:Delete/update table entries by joining 2 tables on Google BigQuery without import/export)。

【问题讨论】:

您可以通过将所有表保留在具有有限访问权限的数据集中,然后在不同数据集中的表上创建视图(自然是只读的)来做到这一点。将表格交换为视图以使其只读。那样有用吗?例如,一些组织有一个只有读取访问权限的“生产”数据集。如果这听起来可行,我可以写一个更完整的答案。 我想过,但这意味着为我拥有的每个“主”表创建 2 个数据集(1 个数据集用于我要合并的当前“更新”表,1 个数据集用于合并过程完成后将接收新数据的新“更新”表)。恐怕这会成为许多数据集的地狱。 【参考方案1】:

目前,这在 BigQuery 中是不可能的。您可以通过https://issuetracker.google.com/issues/new?component=187149&template=0 提交功能请求

同时,解决方法是使用快照装饰器。 因此,在不限制向表中添加行的情况下,您将能够随时获得表状态(如果我没记错的话,在过去两周内)-因此间接地这将为您提供您想要的

快照装饰器是available in Legacy SQL,我认为它们最近是added to Standard SQL

【讨论】:

确实可以保持一致性。我还考虑在我们添加到每一行的 EventTimestamp 列上使用一些过滤。但是,使用这种方法,我无法“截断”“更新表”,因为根据cloud.google.com/bigquery/docs/reference/standard-sql/… 未在流表上启用 DML/删除操作(好吧,至少我可以在执行微批处理时使用该方法而不是流式传输)。 过滤在代码方面可能会更昂贵,如果表继续增长 - 它将导致整个表扫描(所以额外的 $$)。如果它以某种方式有帮助,请考虑对答案进行投票:o) 按照建议,我已经填写了一个功能请求:issuetracker.google.com/issues/68743496

以上是关于将 BigQuery 表切换为“只读模式”的主要内容,如果未能解决你的问题,请参考以下文章

在bigquery中以编程方式更新/插入数据

JSON 表架构到 bigquery.TableSchema 用于 BigQuerySink

将 10 MB 数据上传到 Bigquery

如何关联多个 BigQuery 数组字段?

Cloud Dataflow 中的“辅助输入”是不是支持从 BigQuery 视图中读取?

BigQuery INSERT DML 语句限制