如何通过 API(补丁)授予对 BigQuery 数据集的新视图访问权限

Posted

技术标签:

【中文标题】如何通过 API(补丁)授予对 BigQuery 数据集的新视图访问权限【英文标题】:How give a new view access to a BigQuery dataset via API (patch) 【发布时间】:2016-06-03 11:38:21 【问题描述】:

我在 BigQuery 中有一个数据集,其中包含一些视图权限。

通过 API,我想为该数据集授予新视图权限。使用patch 方法:

...
#permission the view
dataset_ref = 'datasetId': 'dataset_b', 'projectId': 'foo'
update = 'access': [
          
            "view": 
               "projectId": 'foo',
                "datasetId": 'dataset_b',
                "tableId": 'v_test'
             
           
        ]
datasets = service.datasets()
datasets.patch(body=update, **dataset_ref).execute()

但是,它不是将新视图添加到许可视图列表中,而是将它们全部替换。我以为只有update 方法可以做到这一点。来自 update 文档:

警告:指定的访问列表完全覆盖现有的 访问列表。如果您指定一个空的访问列表,您将撤销 访问除您自己以外的所有人;您不能从中删除所有所有者 一个数据集。

来自补丁文档:

更新现有数据集中的信息。更新方法替换 整个数据集资源,而补丁方法仅替换 提交的数据集资源中提供的字段。这 方法支持补丁语义。

是否可以使用 patch 方法添加新视图?

(我知道可以在补丁请求中提供多个视图,但这意味着必须首先查询数据集以获取其所有现有权限,然后添加新权限 - 混乱)

【问题讨论】:

【参考方案1】:

update 方法替换整个数据集资源,而 patch 方法仅替换提交的数据集资源中提供的字段。

上面的关键是 - 补丁方法只替换提供的字段 这意味着访问属性将被替换 - 整个访问属性(提供空列表的情况除外 - 因为任何时候都必须至少有一个所有者存在)

因此,不幸的是,您需要通过首先检索当前 acl 并向其添加新条目来提供整个 acl 列表

【讨论】:

无赖。我想知道是否值得请求该功能。必须进行额外的调用以获取所有 ACL,然后追加,然后将它们全部发回,这真的很尴尬。 考虑一下您可以一次性做出多少不同的更改。更改访问权限、撤销访问权限、添加新访问权限以及多个项目的所有权限。我认为当前的方法使它变得简单-您加载现有的acl-您进行所有需要的更改并提交回新的acl。这对我来说很有意义(就像现在一样) 同时 - 有趣 - 存储团队以不同的方式处理这个问题 - cloud.google.com/storage/docs/json_api/v1/bucketAccessControls - 这可能是有原因的 当然可以,但是如果我只想添加一个新的 ACL 怎么办。然后是一个额外的网络请求,首先获取现有的 ACL,修改然后修补。对我来说感觉有些笨拙。 GCS 的好地方! 当然 - 理解 - 在设计 api 时总要考虑这个和那个之间的平衡。这很可能是谷歌团队考虑的。在我的实践中,acl 不像其他以数据为中心的 api 那样频繁,所以我从来没有感觉到这种特殊需求【参考方案2】:

我刚刚遇到了同样的问题,并花了一些时间寻找有关如何更新访问条目的答案,因为我收到了“无法从数据集中删除所有所有者”消息。

这并不能回答您的补丁问题,但可以解决该错误并希望为其他人节省一些时间。

updating-datasets 文档解决了我的问题,但是是的,它会抓取所有附加条目并全部更新。

【讨论】:

以上是关于如何通过 API(补丁)授予对 BigQuery 数据集的新视图访问权限的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Graph API - 如何通过 API 向特定用户授予对我的收件箱的访问权限

在 Google 表格中使用 BigQuery,如何授予其他用户按“刷新”的权限?

如何授予查看者从 Data Studio 更改 BigQuery 参数的权限

如何使用 BigQuery 补丁?

Google BigQuery API,如何设置destinationTable 的字段类型?

Google BigQuery:授予服务帐户权限以仅在某些特定数据集中创建作业