背景
我正在研究创建一个简单的网络应用程序,其中一部分将显示与Items关联的图像。我决定研究使用SQL Server 的功能,该功能将允许将二进制图像数据直接上传到公开的共享中。因此,有一个用例允许通过 Windows 资源管理器删除文件(a 中的行)。此示例复制了该问题,该问题源于与.FILETABLE
FILETABLE
FILETABLE
结构
已经使用文件资源管理器将图像添加FILETABLE
到:path_locator
0xFF5354649088A1EFEE8F747CD11030F80800170620
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 数据强制执行锁定或并发语义。这种类型的任何内部事务都是通过读提交隔离完成的。