0

我有一个ASP.NET MVC应用程序的文件上传到Azure blob存储和生成的文件名保存在Azure中的SQL Server数据库的表中。我想直接删除数据库中的文件,我希望删除触发器能够删除Azure blob存储中的文件。有没有办法从SQL Server Azure中的触发器删除中删除Azure blob存储中的文件?

也许PowerShell中的工作,但似乎不是由SQL Server Azure的

参考“master.dbo.xp_cmdshell”数据库和/或服务器名称支持未在此版本的SQL Server的支持。

任何想法?谢谢

+0

你看过Azure函数吗? https://azure.microsoft.com/en-us/services/functions/ –

+0

我已经有一个应用服务,我必须支付额外的费用吗? “基于定时器的处理”功能可以工作。 – juliernes

回答

0

根据此articlethis,CLR存储过程,查询通知,扩展存储过程都不可用Azure SQL上。

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

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

您可以在Web应用程序的队列中添加消息(包括blob文件名)或使用Azure存储浏览器。

然后在webjob中,您可以根据此队列消息编写代码来删除blob文件和sql记录。

更多有关如何在蔚蓝webjob使用队列触发的详细信息,您可以参考以下文章:https://docs.microsoft.com/en-us/azure/app-service-web/websites-dotnet-webjobs-sdk-storage-queues-how-to

另一种方式:

您可以启用变化对特定表跟踪,让你可以使用计划webjob发现最新的变化(即删除)到表中,并根据记录删除blob中的文件。

更多细节,你可以参考下面的查询和文章:

1.启用更改跟踪:

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; 

结果: enter image description here

注意:我建议你ld使用blob名称作为主键,因为如果删除记录,则更改跟踪表只记录主键。

有关如何使用更改跟踪表的更多详细信息,请参阅this article

然后您可以使用timertriggerscheduled webJob]每分钟获取表格更改的记录。

最后,您可以使用Azure存储SDK根据此记录在webjob中删除blob。

+0

你帮我解决了第二个问题。因为我有几个表来保存文件,而不是启用更改跟踪,所以我创建了一个表来存储所有表中删除的所有文件,并在每个表中删除触发器。然后,日程安排webjob只需检查该表是否有行并继续删除文件和行。感谢您的详细解答。 – juliernes

相关问题