C# 如何将Azure SQL与Azure BLOB存储同步?

C# 如何将Azure SQL与Azure BLOB存储同步?,c#,sql,database,azure,blob,C#,Sql,Database,Azure,Blob,我有保存在Azure Blob存储中的文件,我有一个数据库保存这些文件的URI。有没有标准的同步方法?我的意思是,如果不删除数据库中的记录,就不可能删除文件,反之亦然。没有任何工具可以确保数据库记录和Azure Blob存储之间的引用完整性 另一种方法是,您可以使用一个worker角色来保持文件与数据库同步(但是您可以灵活地在这里进行延迟) 另一个有争议的干净方法是,只有一个用于添加/删除blob文件的入口点,并在该位置处理与数据库的同步。我同意scripni,您也可以投票支持以下问题: 如果

我有保存在Azure Blob存储中的文件,我有一个数据库保存这些文件的URI。有没有标准的同步方法?我的意思是,如果不删除数据库中的记录,就不可能删除文件,反之亦然。

没有任何工具可以确保数据库记录和Azure Blob存储之间的引用完整性

另一种方法是,您可以使用一个worker角色来保持文件与数据库同步(但是您可以灵活地在这里进行延迟)


另一个有争议的干净方法是,只有一个用于添加/删除blob文件的入口点,并在该位置处理与数据库的同步。

我同意scripni,您也可以投票支持以下问题:


如果blob存储有事件,则可以知道何时插入事件,然后更新数据库。您还可以有一个工作者角色或只是cron作业,前提是每隔一段时间查询blob存储并相应地更新SQL。

在Azure平台上实现事务的一种方法是使用队列。 将消息放置在队列中,并仅在成功处理消息后删除该消息


这样,如果任何操作失败,您可以在下次看到消息时尝试纠正这种情况

没有现成的方法,所以你需要自己写。我发现这个文件监视器示例很有用:

我的解决方案是使用scripni建议的单一入口点,并向其添加类似事务的方法

我使用数据库作为整个事务的预写日志

1) 将数据库记录标记为“shouldBeDeleted”=true

2) 尝试删除blob

3) 如果出现错误且未删除blob,则您仍然拥有记录,并且您知道应该删除它们所指向的blob。您可以稍后再次尝试删除它们,更重要的是,您可以像使用软删除方法一样忽略读取查询中的记录

4) 如果删除了blob,现在可以删除记录

5) 如果失败,记录仍然标记为“shouldBeDeleted”,允许您忽略它们并在以后清理它们

对我来说,主要的好处是,我不必为此目的创建一个worker,而且更改是即时的,而不是依赖于记录未同步时留下窗口的同步周期

对于插入/更新,您可以用几乎相同的方式实现相同的想法


*有点晚了,但我相信问题仍然存在,其他人也遇到了。

创建一个工作角色,并在单个事务范围内完成所有文件和数据库操作。谢谢我认为这会起作用我也遇到了类似的问题,我们就是这样解决的,先删除数据库记录,然后删除文件,如果文件不删除,那么回滚数据库事务。注意服务之间的开放连接