【问题标题】:Updating BigQuery dataset access from C#从 C# 更新 BigQuery 数据集访问
【发布时间】:2020-03-09 17:46:48
【问题描述】:

我正在使用 BigQuery。我创建了一个 DataSet,我想用 C# 语言定义访问权限。 我不清楚该怎么做。 在 GOOGLE 网页 https://cloud.google.com/bigquery/docs/dataset-access-controls 中解释了如何使用 Java 和 Pyton 的一些示例来做到这一点(见下文),但没有为 c# 提供示例。

example in pyton:
dataset = client.get_dataset(dataset_id)  # Make an API request.

entry = bigquery.AccessEntry(
    role="READER",
    entity_type="userByEmail",
    entity_id="sample.bigquery.dev@gmail.com",
)

entries = list(dataset.access_entries)
entries.append(entry)
dataset.access_entries = entries

dataset = client.update_dataset(dataset, ["access_entries"])  # Make an API request.

full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)

有人可以帮忙吗?

【问题讨论】:

    标签: c# google-bigquery dataset roles access-rights


    【解决方案1】:

    最好使用BigQueryDataset.Patch 方法,来自Google.Cloud.BigQuery.V2 包:

    // Fetch the existing dataset
    var client = BigQueryClient.Create(projectId);
    var dataset = client.GetDataset(datasetId);
    
    var accessList = dataset.Resource.Access ?? new List<AccessData>();
    accessList.Add(new AccessData
    {
        Role = "Reader",
        UserByEmail = "sample.bigquery.dev@gmail.com"
    });
    var patchedResource = new Dataset { Access = accessList };
    
    // Push the changes back up to BigQuery
    dataset.Patch(patchedResource, matchETag: true);
    

    作为替代方案,您可以使用Update 完全更新替换数据集资源:

    // Fetch the existing dataset
    var client = BigQueryClient.Create(projectId);
    var dataset = client.GetDataset(datasetId);
    
    // Modify it in memory
    var resource = dataset.Resource;
    if (resource.Access is null)
    {
        // If there's no access list yet, create one.
        resource.Access = new List<AccessData>();
    }
    var newAccess = new AccessData
    {
        Role = "Reader",
        UserByEmail = "sample.bigquery.dev@gmail.com"
    };
    resource.Access.Add(newAccess);
    
    // Push the changes back up to BigQuery
    dataset.Update();
    

    【讨论】:

    • 您好 Jon Skeet,非常感谢您的建议。我认为你的解决方案很好。 Unfurtunatelly 我以前没有读过它,但我已经实现了一些非常相似的东西并且它有效。唯一的区别是我使用补丁功能而不是更新。我将发布我的方法。
    • @ClementeMadrassi:请注意我的第一个示例也使用了 Patch。
    • @Debasish22:请不要在一篇文章中使用 cmets 来引起对另一篇文章的关注。我现在看一下,但它确实不适合使用cmets。
    • @JonSkeet 确定。对此感到抱歉
    【解决方案2】:

    在和我设法使它工作。 我使用了 Jon Skeet 建议的相同解决方案,使用 Patch 方法。 我在这里附上我的代码。

    public static bool GrantDatasetAccess(string dataSetId, bool online, string role, string email, 字符串 bigQueryJsonPath、字符串 bigQueryScope、字符串 projectId、clsLog 日志) {

            try
            {
                BigQueryClient client = GetBigQueryClient(online, bigQueryJsonPath, bigQueryScope, projectId);
                BigQueryDataset dataset = GetDataSet(online, dataSetId, bigQueryJsonPath, bigQueryScope, projectId, log);
    
                List<AccessData> accessList = new List<AccessData>();
                var accessData = new AccessData()
                {
                    Role = role,
                    GroupByEmail = null,
                    UserByEmail = email,
                    SpecialGroup = null,
                    IamMember = null,
                    Domain = null,
                    View = null
    
                };
                accessList.Add(accessData);
                dataset.Resource.Access = accessList;
                dataset.Patch(dataset.Resource, true);
            }
            catch (Exception e)
            {
                log.ManageError("Error GetDataSet: {0}\nError: {1}", dataSetId, string.Concat(e.Message, "\n", e.StackTrace));
            }
            return true;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多