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

时间:2017-04-09 04:55:53

标签: sql-server azure azure-sql-database azure-storage-blobs azure-webjobs

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

也许PowerShell会起作用,但似乎SQL Server Azure不支持

  

在master.dbo.xp_cmdshell'中引用数据库和/或服务器名称。此版本的SQL Server不支持。

有什么想法吗?感谢

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

有关如何在azure 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
*
FROM CHANGETABLE(CHANGES YourBlobTable, 0) AS ChTbl; 

结果: enter image description here

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

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

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

最后,您可以使用azure storage SDK根据webjob中的此记录删除blob。