有没有办法从 SQL Server Azure 中的触发器删除中删除 Azure blob 存储中的文件?

Is there a way to delete a file in Azure blob storage from trigger delete in SQL Server Azure?

我有一个 ASP.NET MVC 应用程序,其中文件上传到 Azure blob 存储,生成的文件名保存在 Azure 的 SQL 服务器数据库中的 table 中。我想直接在数据库中删除文件,我希望删除触发器能够删除 Azure blob 存储中的文件。

也许 PowerShell 可以工作,但 SQL Server Azure

似乎不支持它

Reference to database and/or server name in 'master.dbo.xp_cmdshell' is not supported in this version of SQL Server.

有什么想法吗?谢谢

根据此 article and this,CLR 存储过程、查询通知、扩展存储过程在 Azure 上都不可用 sql。

所以我认为我们不能使用 sql 服务器触发器直接删除 blob。

一种方式: 您可以在 azure webjob 中使用队列触发器来删除 sql 记录和 blob 文件。

您可以在 Web 应用程序或使用 Azure 存储资源管理器中向队列添加消息(包括 blob 文件名)。

然后在webjob中,可以写代码删除blob文件,sql根据这个queue消息记录

更多关于如何在azure webjob中使用queue trigger的详细信息,您可以参考下面的文章:https://docs.microsoft.com/en-us/azure/app-service-web/websites-dotnet-webjobs-sdk-storage-queues-how-to

另一种方式:

您可以在特定的 table 上启用更改跟踪,以便您可以使用计划的 webjob 发现对 table 的最新更改(即删除),并根据记录删除文件斑点。

您可以参考以下查询和文章的更多详细信息:

1.Enable 更改跟踪:

ALTER DATABASE yourdatabase  
SET CHANGE_TRACKING = ON  
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)  

ALTER TABLE YourBolbTable
ENABLE CHANGE_TRACKING  
WITH (TRACK_COLUMNS_UPDATED = ON) 

2.Select 修改记录:

SELECT
*
FROM CHANGETABLE(CHANGES YourBlobTable, 0) AS ChTbl; 

结果:

注意:我建议您可以使用 blob 名称作为主键,因为如果删除记录,更改跟踪 table 只需记录主键。

关于如何使用更改跟踪table的更多详细信息,您可以参考this article

然后你可以使用 timertrigger or scheduled webJob ] 来获取 table 每分钟更改的记录。

最后在webjob中可以根据这条记录使用azure storage SDK删除blob