Banco de Dados - SQL Server

Utilizando File Stream

Um artigo ensinando ao desenvolvedor para que serve e como utilizar o File Stream, uma das novas features do SQL Server 2008.

por Eduardo Bergantini Pinto



Hoje vou falar um pouco sobre uma das inovações no SQL Server 2008, o Filestream.

Entendendo o filestream.
O SQL Server sempre proveu a capacidade de armazenar dados binários, assim você podia pegar qualquer tipo de arquivo e armazená-lo com uma coluna do tipo VARBINARY(MAX).
no entanto um BLOB (Binary Large Object) tem um padrão de usabilidade diferente de dados relacionais, que são concatenados por meio de I/O e armazenados como dados  estendidos, não é possível fazer um streaming de um BLOB.
Por causa dessa limitação, a solução paliativa dos desenvolvedores era disponibilizar o arquivo em um diretório e apenas indicar o caminho no banco de dados, que ainda sim é uma solução viável mesmo dispondo do Filestream.

Criando e utilizando o filestream.

Por padrão o FILESTREAM vem habilitado na instancia do SQL Server 2008.
quando você vai criar o seu banco de dados deve apontar para ele onde ficará a armazenado o diretório do seu FileStream.

CREATE DATABASE [Teste] ON PRIMARY
     
(NAME = N"Teste_Data", FILENAME = N"D:\Teste\data\Teste.mdf", SIZE = 8MB, MAXSIZE = UNLIMITED, FILEGROWTH = 16MB),

FILEGROUP FgTesteSave

      (NAME = N"Teste_Data2", FILENAME = N"D:\Teste\data_save\Teste.ndf", SIZE = 8MB, MAXSIZE = UNLIMITED, FILEGROWTH = 16MB),

FILEGROUP FgTesteDocuments CONTAINS FILESTREAM DEFAULT

     (NAME = N"Teste_Documents", FILENAME = N"D:\Teste\document")

LOG ON

      (NAME = N"Teste_Log", FILENAME = N"D:\Teste\log\Teste.ldf", SIZE = 8MB, MAXSIZE = 2048GB, FILEGROWTH = 16MB)

GO

Na criação de um filestream repare bem que você deve apontar um diretório e não um arquivo, dentro desse diretório serão criados os arquivos para filestream.

Mas e nos casos em que o banco de dados ainda não tem FileStream ?
Nesse caso você utilizaria o seguinte código, para dizer ao seu banco de dados para criar a estrutura de FileStream para você:

ALTER DATABASE [Teste]

ADD FILEGROUP FgTesteDocuments CONTAINS FILESTREAM

GO

ALTER DATABASE [Teste]

ADD FILE

(

    NAME= "fs_filestream",

    FILENAME = N"D:\Teste\document"

)

TO FILEGROUP FgTesteDocuments

GO

A primeira vez que você for para o diretório document você encontrará alguns arquivos NTFS com GUID"s como nome, e alguns arquivos principais com arquivos de log. Todo esse funcionamento serve para criar o namespace do filestream.
Em seguida vamos criar a nossa tabela que será responsável pelo armazenamento desses arquivos.

CREATE TABLE [dbo].[TestarMedia] (

    [testeID] UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL PRIMARY KEY,

    [dataCriacao] DATETIME NOT NULL DEFAULT(GETDATE()),

    [criadoPor] NVARCHAR(255) NOT NULL,

    [fileName] NVARCHAR(255) NOT NULL,

    [tipoTeste] NVARCHAR(255) NOT NULL,

    [localizacao] GEOMETRY NULL,

    [arquivo] VARBINARY(MAX) FILESTREAM);

GO


tabelas que contem colunas com filestream requerem uma com a propriedade ROWGUILDCOL ela serve para o sistema de armazenamento manter traçado a instancia do banco no filesystem.
Um dos pontos positivos de utilizar o filestream para armazenar seus arquivos é que, por estar dentro do SQL Server você não terá problema com perda de dados, ou corrupção de dados a menos que tenha ocorrido na hora de ser inserido, podendo assim recuperar seus dados em caso de catastrofes realizando um simples restore no banco.

FONTE: livro Microsoft SQL Server 2008 - Implementation and Maintenance

Eduardo Bergantini Pinto

Eduardo Bergantini Pinto