Azure 存储容器中 Blob 的 CreatedBy/LastModifiedBy 信息
Posted
技术标签:
【中文标题】Azure 存储容器中 Blob 的 CreatedBy/LastModifiedBy 信息【英文标题】:CreatedBy/LastModifiedBy information for a Blob in Azure Storage Container 【发布时间】:2018-12-23 12:06:34 【问题描述】:我正在尝试处理 Azure 存储容器中的一些 blob。我们的业务用户将csv
文件上传到blob container
。任务是处理这些文件并将数据保存在Azure SQL DB
的临时表中,以便他们稍后进行分析。这涉及创建与csv
文件的文件结构动态匹配的表。我已经让这部分工作正常。我正在使用python
来完成这部分任务。
任务的下一部分是在数据库中处理完blob
后通过电子邮件通知用户(谁上传了blob),向他们提供与blob
对应的表名。理想情况下,我还应该能够通过仅在与他上传的blob
对应的表上向用户授予读取权限来设置数据库中的权限。
为了实现这一点,我想我会从blob
属性中读取blob
owner
或last modified by
属性,并将该信息用于通知/数据库权限。但我无法在blob properties 中找到任何此类属性。我尝试在存储帐户级别使用诊断日志记录,但日志也没有显示有关 created by
或 modified by
的任何信息。
有人可以指导我如何让这个工作正常吗?
【问题讨论】:
【参考方案1】:由于有关谁创建/最后修改了 blob 的信息不能作为系统属性提供,因此您需要提出自己的实现。我可以想到一些解决方案(不使用外部数据库来存储这些信息):
将此信息存储为 blob 的元数据:每个 blob 都可以有自定义元数据。您可以通过创建两个键将此信息存储在 blob 的元数据中:CreatedBy
和 LastModifiedBy
,并存储适当的信息。请注意,blob 的元数据不可查询,而且很容易覆盖元数据。这是迄今为止我能想到的最简单的方法。
使用x-ms-client-request-id
:对于 Azure 存储的每个请求,您可以在 x-ms-client-request-id
请求标头中传递自定义值。如果启用了存储分析,则会记录此信息。然后,您可以查询分析数据以查找此信息。但是,在分析日志中查找此信息非常麻烦,因为该信息作为行项目保存在 $logs
容器中的 blob 中。要查找此信息,您首先需要找到包含此信息的适当 blob。然后,您需要下载 blob,找到相应的日志条目并提取此信息。
考虑到没有一个解决方案是完美的,我建议您将此信息保存在外部数据库中。如果使用外部数据库,实现目标会简单得多。
【讨论】:
谢谢@Gaurav Mantri。我很高兴实现外部数据库方法,因为它似乎是最简单直接的(可惜在 Azure 中实现如此看似简单的任务仍然如此困难)。但是,我仍然不确定如何获取上传的blob
的CreatedBy
或LastModifiedBy
信息。能详细点吗?
您可以通过门户或 API/SDK 轻松创建索引,该索引易于基于元数据@AmitSukralia 进行查询【参考方案2】:
azure 中的 Blob 支持将自定义元数据作为键/值对的字典,您可以保存 foreach 文件,但根据我的经验,它在所有情况下都不是很方便,特别是因为您无法在不读取 blob 的情况下查询那些(azure 将向您收取该费用),而无需考虑网络传输。
来自: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata
Azure 存储中的对象支持系统属性和用户自定义 元数据,以及它们包含的数据。
系统属性:系统属性存在于每个存储资源上。 其中一些是可以读取或设置的,而另一些是只读的。在下面 涵盖,某些系统属性对应于某些标准 HTTP 标题。 Azure 存储客户端库会为您维护这些内容。
用户定义的元数据:用户定义的元数据是您定义的元数据 以名称-值对的形式在给定资源上指定。你可以 使用元数据通过存储资源存储附加值。这些 其他元数据值仅供您自己使用,不 影响资源的行为方式。
我有一次非常相似的事情要做,为了避免创建外部数据库并连接,我刚刚在存储中创建了一个表来保存 blob 存储中的每个文件 url,而没有您需要的所有属性(用户权限)以非结构化的方式。
您可能会发现使用 python 从表中查询信息非常简单(我使用 .net),但我发现它几乎相同。
https://docs.microsoft.com/en-us/azure/cosmos-db/table-storage-how-to-use-python
Azure 表存储和 Azure Cosmos DB 是存储 云中的结构化 NoSQL 数据,提供键/属性存储 采用无模式设计。因为表存储和 Azure Cosmos DB 是无模式的,很容易根据您的需要调整您的数据 应用进化。快速访问表存储和表 API 数据 和成本效益的许多类型的应用程序,并且通常是 对于类似的数据量,成本低于传统 SQL。
过滤示例代码:
from azure.cosmosdb.table.tableservice import TableService
from azure.cosmosdb.table.models import Entity
table_service = TableService(connection_string='DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey;TableEndpoint=myendpoint;)
tasks = table_service.query_entities('tasktable', filter="PartitionKey eq 'tasksSeattle'")
for task in tasks:
print(task.description)
print(task.priority)
因此,您只需要创建表并使用 azure 中的键来连接它。 希望它可以帮助你。
【讨论】:
欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的内容您链接到的页面的一部分,以防目标页面不可用。Answers that are little more than a link may be deleted。 感谢@David Revoledo。如果没有可用的CreatedBy
和LastModifiedBy
信息,在我的情况下实现表存储是没有意义的。还是我误解了你的答案?
在表存储中,您可以保存非结构化数据,因此,您可以保存任何您想要的内容并手动处理这些属性,然后将链接保存到存储中,如下所示:table : [ CreatedBy : " user1”,“LastModifiedBy”:“user2”:链接:“storage.azure.url”, CreatedBy:“user1”,“LastModifiedBy”:“user2”:链接:“storage.azure.url”]跨度>
您可以通过门户或 API/SDK 轻松创建索引,该索引易于基于元数据@DavidRevoledo 进行查询以上是关于Azure 存储容器中 Blob 的 CreatedBy/LastModifiedBy 信息的主要内容,如果未能解决你的问题,请参考以下文章
需要通过oledb连接从azure存储blob容器中读取excel文件
使用 powershell 在 Azure 中不同订阅的存储容器之间复制 blob