2016-01-20 62 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;刪除該行後刪除 。