我期待到創建一個簡單的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'' –