FILESTREAM - SQLClub

На http://sqlclub. ru / forum / Веднъж имах подобна тема. В момента обаче sqlclub.ru е недостъпен поради нечестността на човек на име Сергей Заворуев, който очевидно е решил тайно да присвои съдържанието. Ще трябва да повторим тази тема тук, защото скоро ще ни трябва.

За да поддържате типа FileStream, трябва да създадете подходяща файлова група на базово ниво. Името на файл за тази група е локална папка във файловата система. Не можем да вземем файл от произволен път, да го пъхнем в SQL Server и да кажем: вижте, това ще бъде вашето поле за файлов поток в такъв и такъв запис. Както ще видим по-късно, можем само да копираме съдържанието на този файл в полето и то ще бъде съхранено във файла, който SQL Server ще му присвои и ще го наименува в съответствие със своите правила.

ако съществува (изберете 1 от sys .databases, където name = 'TestFS' ) започва

промяна на база данни TestFS set single_user с незабавно връщане назад

пуснете база данни TestFS

създаване на база данни TestFS на

първичен (име = TestFS_data, име на файл = 'c:\Temp\TestFS_data.mdf'),

файлова група FG1 съдържа файлов поток

(име = TestFS_media, име на файл = 'c:\Temp\TestFS_media')

влезте (име = TestFS_log, име на файл = 'c:\Temp\TestFS_log.ldf')

Ето какво се появи след създаването на базата данни в директорията c:\Temp:

sqlclub

Регистрираното в групата файлов поток име на файл е папка на локалния диск. Ако предложите топка, той ще изругае:

създайте база данни TestFS1 на

първичен (име = TestFS_data, име на файл = 'c:\Temp\TestFS_data.mdf'),

файлова група FG1 съдържа файлов поток

(име = TestFS_media, име на файл = '\\192.168.0.1\c$\Temp\TestFS_media')

дневникна (име = TestFS_log, име на файл = 'c:\Temp\TestFS_log.ldf')

Msg 5135, ниво 16, състояние 2, ред 1

Пътят '\\192.168.0.1\c$\Temp\TestFS_media' не може да се използва за FILESTREAM файлове. За информация относно поддържаните пътища вижте SQL Server Books Online.

Msg 1802, ниво 16, състояние 2, ред 1

СЪЗДАВАНЕТО НА БАЗА ДАННИ е неуспешно. Някои изброени имена на файлове не можаха да бъдат създадени. Проверете свързаните грешки.

Посоченият път трябва да съществува до ниво n-1, в нашия случай c:\Temp. Папката TestFS_media не трябва да съществува.

Можете да създадете няколко файлови групи от типа файлов поток:

създайте база данни TestFS1 на

първичен (име = TestFS_data, име на файл = 'c:\Temp\TestFS_data1.mdf'),

файлова група FG1 съдържа файлов поток

(име = TestFS_media1, име на файл = 'c:\Temp\TestFS_media1'),

файлова група FG2 съдържа файлов поток

(име = TestFS_media2, име на файл = 'c:\Temp\TestFS_media2')

влезте (име = TestFS_log, име на файл = 'c:\Temp\TestFS_log1.ldf')

обаче само една папка може да бъде регистрирана във файлова група Filestream. Не можете да направите това:

файлова група FG 1 съдържа файлов поток

(име = TestFS_media, име на файл = 'c:\Temp\TestFS_media'),

(име = aaa, име на файл = 'c:\aaa')

Тези. няма да е възможно автоматично да се разпределят файловете на файловия поток в различни папки.

След като създадете база данни с файлова група на файлов поток, можете да създавате таблици с полета на файлов поток. В оператор CREATE TABLE полето на файлов поток е обикновен блоб ( varbinary ( max )) с атрибут на файлов поток.

създаване на таблица Media(

>първичен ключ за самоличност,

[gu >uniqueidentifier по подразбиране newid() уникален rowguidcol не е нула,

[fileName] nvarchar (256),

тип съдържаниеnvarchar(256),

петно ​​nvarchar (макс.),

поток varbinary (макс.) файлов поток

Ако в таблицата има поле за файлов поток, наличието на уникалното поле lang=RU> също е задължително.То може да бъде без стойност по подразбиране, но за него са задължителни три атрибута: unique, rowguidcol, not null. Макар и уникален > Ето защо unique lang=RU>, за да бъде уникален е необходимо това условие, така че например стойност от предишната да не попадне в нов запис. Освен това оптимизаторът се чувства много по-щастлив, когато види явен уникат. Атрибутът rowguidcol ви позволява да се обърнете към полето не по име, а като $ rowgu lang=RU>: например изберете $rowguid от Media. Ясно е, че такова поле трябва да бъде по едно на таблица. Честно казано, не мога да кажа какво фундаментално значение носи този атрибут. Просто има ситуации, които го налагат и затова. Преди това сливането-репликация им принадлежеше, сега е добавен файлов поток.

Наличието на първичен ключ не е задължително. В този случай можем да направим без > по-лесно, отколкото да запомните ръководството.

A posteriori, можете да разберете дали дадено поле има атрибут на файлов поток като този:

изберете * от sys. колони, където object_id = object_id ('Media', 'table') и system_type_ >= type_id ('varbinary') и max_length = - 1 и is_filestream = 1

След като таблицата беше създадена в C:\Temp\TestFS_media (параметърът на името на файла на групата файлови потоци при създаване на базата данни), се появи директория с името на някакво ръководство, съответстващо на таблицата, в нея имаше друго с името на някакво ръководство, съответстващо на полето на файловия поток в тази таблица (може да има няколко от тях по броя на такива полета).

sqlclub

Temp

sqlclub

Нека сега добавим записи към него:

вмъкване на медия ( поток ) стойности ( cast ( N'aaa' asvarbinary(макс)))

вмъкване на медийни ( поток ) стойности ( cast ( N'bbb' като varbinary ( max )))

вмъкнете Media ( поток ) стойности ​​( cast ( N'ccc' като varbinary ( max )))

След поставяне в листовата директория се появиха три файла с имена на водачи, съответстващи на трите поставени записа. При стойност NULL файлът не се стартира, трябва да има нещо непразно в петното. Празен низ вече не е празен.

Temp

Тук го редактирахме:

запазете и вижте какво ще се случи:

изберете *, предаване (поток като nvarchar (макс.)) от Media

Temp

Като пример за това как всичко това е под контрола на SQL Server, нека видим как файловите потоци се архивират заедно с базата данни. Правене

архивиране на база данни TestFS на диск = 'c:\Temp\Test_FS.bak' с init

След това изпускаме базата, докато папката TestFS_media изчезва от c: \ Temp заедно с всички нейни файлове, в които се съхранява съдържанието на полето на файловия поток от различни записи на таблицата Media. База за възстановяване:

възстановяване на база данни TestFS от диск = 'c:\Temp\Test_FS.bak' с преместване на 'TestFS_media' в 'c:\aaa'

sqlclub

Тук W WI TH MOVE е стандартната опция, която указва при възстановяване, че логическите имена на файлове вече ще съвпадат с други физически пътища. Казваме, че c:\Temp\TestFS_media се премества в c:\aaa. В същото време папката aaa се създава автоматично на диска с:, където е разположена файловата група на файловия поток. Точно както при създаването на база данни, целият указан път трябва да съществува от корена на диска до ниво n-1, т.е. ако кажем с преместване на 'TestFS_media' в 'c:\aaa\bbb', няма да работи.

Както и HierarchyID, за който доста изрекох в предишни публикации, и геопространствени типове, изказвания по темата за които все още санапред, типът файлов поток се поддържа в безплатния SQL Server, който е SQL Express. Освен това ограниченията на размера на базата данни за SQL Express не се прилагат за данни, съхранявани във Filestream blobs.