2016-01-20 4 views
2

фонУдалить из FILETABLE с ограничением внешнего ключа

Я ищу в создании простой веб-приложения, часть из которых будет отображать изображений связанных с пунктами. Я решил изучить функцию FILETABLE SQL Server, которая позволит напрямую загружать данные двоичного изображения в открытый ресурс. Таким образом, существует прецедент, позволяющий удалить файлы (строки в FILETABLE) через проводник Windows. Этот пример реплицирует проблему, которая связана с наличием отношения внешнего ключа к FILETABLE.

Структура

Уже добавлено изображение с помощью File Explorer на 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); 

Выпуск

При удалении файла с помощью File Explorer. ..

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-код, который обрабатывает удаление?

Update # 1

С BOL, следующий раздел вид подтверждает поведение, хотя и не дает никакой дополнительной информации.

транзакционные Семантика

При доступе файлы в FileTable с помощью файлового ввода/API для вывода, эти операции не связаны с какими-либо пользовательских транзакций, и имеют следующие дополнительные характеристики:

  • Поскольку неконтрактированный доступ к данным FILESTREAM в FileTable не связан ни с какой транзакцией, он не имеет какой-либо конкретной семантики изоляции. Однако 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 к:', FOREIGN KEY ([path_locator]) ЛИТЕРАТУРА [DBO]. [Image] ([path_locator]) ON DELETE CASCADE' действительно распространяет удаление. Не уверен, как я тогда не думал об этом, но спасибо! –

0

Похоже, что существует проблема с внешним ключом. Поскольку к этой таблице прикреплен внешний ключ, поэтому вы не можете просто удалить строку, поскольку сбой внешнего ключа не выполняется.

Итак, сначала отключите проверку внешнего ключа в sql: SET FOREIGN_KEY_CHECKS = 1;

затем попробуйте удалить & да не забудьте установить проверку внешнего ключа на 0: SET FOREIGN_KEY_CHECKS = 0; после удаления строки.

Смежные вопросы