Python 如何通过API(补丁)为新视图提供对BigQuery数据集的访问权限

Python 如何通过API(补丁)为新视图提供对BigQuery数据集的访问权限,python,google-bigquery,Python,Google Bigquery,我在BigQuery中有一个数据集,允许使用一些视图 通过API,我想为该数据集创建一个新视图。使用以下方法: 但是,它不是将新视图添加到许可视图列表中,而是将它们全部替换。我以为只有方法才能做到这一点。从更新文档中: 警告:指定的访问列表将完全覆盖现有的访问列表 访问列表。如果指定的访问列表为空,则将撤消 接触除你之外的所有人;不能从中删除所有所有者 数据集 从修补程序文档: 更新现有数据集中的信息。更新方法将替换 整个数据集资源,而补丁方法仅替换 提交的数据集资源中提供的字段。这 方法支持补

我在BigQuery中有一个数据集,允许使用一些视图

通过API,我想为该数据集创建一个新视图。使用以下方法:

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

警告:指定的访问列表将完全覆盖现有的访问列表 访问列表。如果指定的访问列表为空,则将撤消 接触除你之外的所有人;不能从中删除所有所有者 数据集

从修补程序文档:

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

是否可以使用面片方法添加新视图


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

更新方法将替换整个数据集资源,而补丁方法仅替换提交的数据集资源中提供的字段

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


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

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

这并不能回答您的补丁问题,但提供了解决错误的方法,希望能为其他人节省一些时间


文档解决了我的问题,但是是的,它会抓取所有条目的附件并更新它们。

Bummer。我想知道是否值得请求该功能。很难做一个额外的调用来获取所有的ACL,然后追加,然后把它们全部送回。考虑一下在一次拍摄中你可能会做出多少不同的改变。更改访问权限、撤销访问权限、添加新访问权限以及多个项目的所有访问权限。我认为当前的方法很简单——加载现有的acl——完成所有需要的更改并提交新的acl。这对我来说是有意义的(就像现在一样),同时——有趣的是——存储团队以不同的方式处理这一问题——这可能是有原因的,但如果我只想添加一个新的ACL呢。然后是一个额外的网络请求,首先获取现有ACL,修改,然后修补。我觉得有点笨拙。地面军事系统的好地方!当然-在设计API时要考虑这一点和平衡点之间的平衡。这很可能是谷歌团队考虑的。在我的实践中,acl并不像其他以数据为中心的API那样频繁,所以我从未感觉到这种特殊的需要
...
#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()