我期待到创建一个简单的Web应用程序,其中的一部分将显示与项目相关图片。我决定研究使用SQL Server的FILETABLE
功能,它将允许二进制图像数据直接上传到暴露的共享中。因此,有一个用例允许通过Windows资源管理器删除文件(FILETABLE
中的行)。这个例子复制了这个问题,这个问题源于一个外键关系到FILETABLE
。
结构
在已经添加使用文件资源管理器中的图像到FILETABLE
与0xFF5354649088A1EFEE8F747CD11030F80800170620
的path_locator
:
CREATE TABLE [dbo].[Image] AS FILETABLE WITH (FileTable_Directory = 'Images');
GO
CREATE TABLE [dbo].[ImageLink] (
[id] INT NOT NULL IDENTITY(1, 1)
,[path_locator] HIERARCHYID NOT NULL
,FOREIGN KEY ([path_locator]) REFERENCES [dbo].[Image] ([path_locator])
);
GO
INSERT INTO [dbo].[ImageLink] ([path_locator]) VALUES (0xFF5354649088A1EFEE8F747CD11030F80800170620);
问题
在通过文件管理器删除文件。 ..
...文件从目录中消失,因为Windows报告删除成功,但行并未从FILETABLE
中删除。
但是,试图通过SQL Server删除时,熟悉的参考约束冲突引发错误:
DELETE FROM [dbo].[Image] WHERE [path_locator] = 0xFF5354649088A1EFEE8F747CD11030F80800170620;
Msg 547, Level 16, State 0, Line 69
The DELETE statement conflicted with the REFERENCE constraint "FK__ImageLink__path___5070F446". The conflict occurred in database "FileTableTest", table "dbo.ImageLink", column 'path_locator'.
我添加了一个AFTER DELETE
触发到FILETABLE
去除引用行的意图,但是这也不会执行。
问题
- 我怎么可能去传播在删除通过Windows资源管理器通过链接表中删除?
- 是否有某种SQL Server/Windows API挂钩我可以检测并执行处理删除的DML代码?
更新#1
从BOL,下面的部分种类的确认行为,但并没有提供任何进一步的信息。
事务性语义
当您使用文件I/O的API,这些操作不与任何用户事务相关的访问中的FileTable中的文件,并且具有以下附加特性:
- 由于非事务处理访问FileTable中的FILESTREAM数据与任何事务都没有关联,因此它没有任何特定的隔离语义。但是,SQL Server可能会使用内部事务来强制执行FileTable数据上的锁定或并发语义。任何这种类型的内部事务都是通过读提交隔离完成的。
请共享的'SELECT * FROM sys.database_filestream_options' – lad2025
@ lad2025'non_trasacted_access = 2,non_transacted_access_desc =“FULL'' –