2016-01-20 65 views
2

背景从文件表删除与外键约束

我期待到创建一个简单的Web应用程序,其中的一部分将显示项目相关图片。我决定研究使用SQL Server的FILETABLE功能,它将允许二进制图像数据直接上传到暴露的共享中。因此,有一个用例允许通过Windows资源管理器删除文件(FILETABLE中的行)。这个例子复制了这个问题,这个问题源于一个外键关系到FILETABLE

结构

在已经添加使用文件资源管理器中的图像到FILETABLE0xFF5354649088A1EFEE8F747CD11030F80800170620path_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 delete file dialog

...文件从目录中消失,因为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数据上的锁定或并发语义。任何这种类型的内部事务都是通过读提交隔离完成的。
+0

请共享的'SELECT * FROM sys.database_filestream_options' – lad2025

+0

@ lad2025'non_trasacted_access = 2,non_transacted_access_desc =“FULL'' –

回答

0

问题是外键。

在您的外键中使用'ON CASCADE DELETE',因此当您通过文件资源管理器删除时,关联的ImageLink也会被删除。

+0

改变FK定义结果:',外键([path_locator])参考文献[DBO]。 [图像]([path_locator])ON DELETE CASCADE'确实传播删除。不知道我当时怎么没有想到这一点,但谢谢你! –

0

看起来,外键有问题。由于有外键附加到该表,因此您不能简单地删除该行,因为外键约束失败。

因此,先禁用SQL中的外键检查: SET FOREIGN_KEY_CHECKS = 1;

然后尝试删除这个&是别忘了将外键检查设置为0: SET FOREIGN_KEY_CHECKS = 0;删除该行后删除 。