Въведение във FILESTREAM Microsoft Docs

Хранилището FILESTREAM използва системния кеш на NT, за да кешира тези файлове. Това намалява потенциалното въздействие на FILESTREAM данните върху производителността на Database Engine. Буферният пул на SQL Server не се използва, така че тази памет е достъпна за обработка на заявки.

Забележка

Данните FILESTREAM не са криптирани, дори ако е активирано прозрачно криптиране на данни.

За ръководство стъпка по стъпка за използване на FILESTREAM stores вижте Първи стъпки с FILESTREAM Store.

Условия за ползване на FILESTREAM

В SQL Server двоичните големи обекти (BLOBs) могат да бъдат стандартния тип данни varbinary(max), съхранен в таблица, или обекти varbinary(max) FILESTREAM, съхранени във файловата система. Изборът на база данни или файлова система за съхранение се определя от размера и предназначението на данните. Обектите FILESTREAM трябва да се използват в следните случаи:

средният размер на записаните обекти надвишава 1 MB;

бързият достъп за четене е важен;

приложенията, които разработвате, използват средното ниво за логиката на приложението.

Когато работите с по-малки обекти, съхраняването на varbinary(max) двоични големи обекти (BLOBs) в базата данни често води до по-добра производителност на нишката.

FILESTREAM, съхранение

FILESTREAM хранилището е реализирано като varbinary(max) колона, чиито данни се съхраняват във файловата система като двоични големи обекти (BLOB). Размерите на BLOB са ограничени само от размера на обема на файловата система. Стандартното varbinary(max) ограничение от 2 GB не се прилага за BLOB.съхранявани във файловата система.

За да укажете дали данните от дадена колона трябва да се съхраняват във файловата система, укажете атрибута FILESTREAM на колона varbinary(max). В резултат на това Database Engine ще съхранява всички данни в тази колона във файловата система вместо във файла на базата данни.

Данните FILESTREAM трябва да се съхраняват във файлови групи FILESTREAM. Файловата група FILESTREAM е специална файлова група, която съдържа файловите директории на системата вместо самите файлове. Тези системни файлови директории се наричат ​​контейнери за данни. Те са интерфейсът между хранилището на Database Engine и хранилището на файловата система.

Когато използвате хранилище FILESTREAM, обърнете внимание на следното:

ако таблицата има колона FILESTREAM, всеки ред трябва да има уникален ID на ред (не NULL);

влагането на контейнери с данни FILESTREAM не е разрешено;

когато използвате клъстериране при отказ, файловите групи FILESTREAM трябва да се намират на споделени дискови ресурси;

Файловите групи FILESTREAM могат да се намират на компресирани томове.

Вградена сигурност

В SQL Server данните FILESTREAM са защитени по същия начин, както всички други данни са защитени: чрез предоставяне на разрешения на ниво таблица или колона. Потребител, който има разрешение за колоната FILESTREAM в таблицата, може да отваря свързаните файлове.

Забележка

Данните FILESTREAM не поддържат криптиране.

NTFS разрешения за достъп до контейнера FILESTREAM се предоставят само от акаунта, под който се изпълнява услугата SQL Server. Други акаунти имат разрешения за достъп до контейнера с даннипредоставянето не се препоръчва.

Интегрирано управление

Модел на двойно програмиране за достъп до BLOB данни

След като данните се съхранят в колоната FILESTREAM, файловете могат да бъдат достъпни чрез Transact-SQL транзакции или Win32 API.

Достъп с Transact-SQL

Езикът Transact-SQL ви позволява да вмъквате, актуализирате и изтривате FILESTREAM данни:

Операцията за вмъкване ви позволява да попълните предварително поле FILESTREAM с NULL стойност, празна стойност или относително малки вградени данни. Въпреки това, когато работите с големи количества данни, може да се постигне по-ефективен стрийминг с файл, който използва интерфейсите Win32.

Актуализирането на полето FILESTREAM променя основните BLOB данни във файловата система. Ако полето FILESTREAM е NULL, BLOB данните, свързани с това поле, се премахват. Актуализация на фрагмент от данни на Transact-SQL, реализирана като UPDATE**.**Конструкция Write() не може да се използва за извършване на частична актуализация на данни.

Изтриването на ред или изтриването или съкращаването на таблица, съдържаща FILESTREAM данни, изтрива основните BLOB данни във файловата система.

Поточен достъп до файловата система

Поддръжката на нишки в Win32 работи в контекста на транзакциите на SQL Server. В рамките на транзакция функциите FILESTREAM предоставят логически UNC път към файл във файловата система.OpenSqlFilestream API ви позволява да получите файлов дескриптор. След това този манипулатор може да се използва от функциите на файловия поток на Win32 катоReadFile() иWriteFile() за достъп и актуализиране на файла през файловата система.

Тъй като файловите операцииса транзакционни, не е възможно да изтриете или преименувате FILESTREAM файлове с помощта на файловата система.

Инструкция Модел

Достъпът до файловата система FILESTREAM моделира Transact-SQL израз, използвайки операции за отваряне и затваряне на файл. Тази инструкция започва, когато се отвори манипулатор на файл и завършва, когато този манипулатор се затвори. Например, когато манипулаторът на записи е затворен, всички възможни тригери AFTER, регистрирани в таблицата, се задействат, сякаш е бил издаден оператор UPDATE.

Пространство от имена за съхранение

В хранилището FILESTREAM, Database Engine управлява пространството от имена на физическата файлова система на BLOB. Нова вградена функция, PathName, предоставя логическия UNC път на BLOB, който съответства на всяка клетка FILESTREAM в таблицата. Приложението използва този логически път, за да получи манипулатор на Win32 и да работи с BLOB данни през нормалните интерфейси на файловата система Win32. Тази функция връща NULL, ако стойността на колоната FILESTREAM е NULL.

Достъп до транзакционната файлова система

Нова вградена функция, GET_FILESTREAM_TRANSACTION_CONTEXT(), връща токен, представляващ действителната транзакция, с която е свързана сесията. Тази транзакция трябва да се изпълнява, да не е прекратена и да не е ангажирана. Получаването на токен позволява на приложението да асоциира потоковите операции на файловата система FILESTREAM с изпълнявана транзакция. Тази функция връща NULL, ако няма изрично стартирана транзакция.

Преди дадена транзакция да може да бъде ангажирана или прекъсната, всички файлови дескриптори трябва да бъдат затворени. Ако манипулаторът е оставен отворен извън обхвата на транзакцията, се прилагат допълнителни четениядо тази дръжка ще се провали; допълнителни операции за запис, приложени към този манипулатор, ще успеят, но действителните данни няма да бъдат записани на диска. По същия начин, ако база данни или екземпляр на Database Engine се прекрати, всички отворени манипулатори стават невалидни.

Надеждност на транзакцията

Когато работите с FILESTREAM, докато транзакцията не бъде ангажирана, транзакционната надеждност за FILESTREAM BLOB данни, които са били модифицирани въз основа на достъп до поток от файлова система, се осигурява от Database Engine.

Семантика на изолацията

Семантиката на изолацията се контролира от нивата на изолация на транзакцията на Database Engine. За достъп до файловата система се поддържа само нивото на изолация READ COMMITTED. Повтарящите се четения и изолирането на сериализуема и моментна снимка се поддържат, когато данните от FILESTREAM се осъществяват чрез Transact-SQL. Мръсните четения не се поддържат.

Операциите за достъп до отворена файлова система не чакат никакво заключване. Вместо това отворените операции се провалят незабавно, ако данните не могат да бъдат достъпни поради изолация на транзакцията. Извикванията на API за поточно предаване са неуспешни с ERROR_SHARING_VIOLATION, ако нарушение на изолацията възпрепятства продължаването на отворената операция.

Частични актуализации

За да позволи извършването на частични актуализации, приложението може да издаде командата FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT, за да извлече старо съдържание във файл, отворен с препратка към дръжка. Това ще започне да копира старото съдържание от страната на сървъра. За да постигнете по-добра производителност на приложението и да избегнетепотенциални повреди, дължащи се на изчакване, когато работите с много големи файлове, се препоръчва използването на асинхронни I/O операции.

Ако командата FSCTL е генерирана след запис в дескриптора, последната операция за запис се запазва и резултатите от предишни записи в дескриптора се губят.

Записване от отдалечени клиенти

Отдалеченият достъп до файловата система до данните на FILESTREAM се извършва с помощта на SMB протокола. Ако клиентът е отдалечен, операциите за запис не се кешират от страната на клиента. Операциите за запис винаги се изпращат към сървъра. Кеширането на данни е възможно от страната на сървъра. В приложения, работещи на отдалечени клиенти, се препоръчва да се комбинират малки записи, за да се намали броят на записите чрез използване на по-големи данни.

Създаването на картирани в памет изгледи (картирани в памет I/O операции) с помощта на манипулатора FILESTREAM не се поддържа. Когато данните на FILESTREAM са картографирани в паметта, Database Engine не може да гарантира последователността и надеждността на данните или целостта на базата данни.