背景
我正在研究创建一个简单的Web应用程序,其中一部分将显示与 Items 相关联的 Images 。我决定使用SQL Server的FILETABLE
功能,它允许将二进制图像数据直接上传到公开的共享中。因此,有一个用例允许通过Windows资源管理器删除文件(FILETABLE
中的行)。此示例复制了该问题,该问题源于与FILETABLE
的外键关系。
结构
已使用文件资源管理器将图像添加到FILETABLE
path_locator
0xFF5354649088A1EFEE8F747CD11030F80800170620
的<{1}}:
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
触发器,目的是删除引用行,但 也不会执行。
问题
更新#1
从BOL开始,以下部分确认了该行为,但未提供任何进一步的信息。
交易语义
使用文件I / O API访问FileTable中的文件时,这些操作不与任何用户事务关联,并具有以下附加特征:
- 由于对FileTable中的FILESTREAM数据的非事务访问与任何事务都没有关联,因此它没有任何特定的隔离语义。但是,SQL Server可能会使用内部事务对FileTable数据强制执行锁定或并发语义。此类型的任何内部事务都是通过读取提交隔离完成的。
答案 0 :(得分:0)
看起来,外键有问题。由于外键附加到该表,因此您不能简单地删除该行,因为外键约束失败。
首先通过以下方式禁用sql中的外键检查: SET FOREIGN_KEY_CHECKS = 1;
然后尝试删除此&amp;是的,不要忘记将外键检查设置为0: SET FOREIGN_KEY_CHECKS = 0; 删除行后。
答案 1 :(得分:0)
问题是外键。
在外键中使用“ON CASCADE DELETE”,因此当您通过文件资源管理器删除时,相关的ImageLink也会被删除。