Professional Documents
Culture Documents
FILESTREAM est une nouvelle fonctionnalit de la version 2008 de SQL Server qui
permet de rpondre certaines lacunes des versions prcdentes concernant les donnes
volumineuses, en particulier les fichiers et documents d'entreprise. Le nouveau mode de
stockage tend la limite maximum des 2 Go, amliore les performances du moteur SQL et
introduit l'intgrit rfrentielle des donnes hberges.
Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)
I - Introduction..............................................................................................................................................................3
II - Type de donnes et FILESTREAM....................................................................................................................... 3
III - Cache systme windows...................................................................................................................................... 3
IV - Installation et configuration...................................................................................................................................3
V - Utilisation de FILESTREAM.................................................................................................................................. 5
VI - Ajout de donnes avec FILESTREAM................................................................................................................. 6
VII - Manipulation des donnes FILESTREAM........................................................................................................... 8
VIII - Recherche Full Text avec FILESTREAM......................................................................................................... 10
IX - Sauvegardes et restauration avec FILESTREAM.............................................................................................. 10
X - Points importants................................................................................................................................................. 10
XI - Bonnes pratiques................................................................................................................................................11
XII - Conclusion......................................................................................................................................................... 11
-2Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/
Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)
I - Introduction
A l'origine les bases de donnes taient conues pour stocker des donnes discrtes. Cependant la varit des
donnes utilises dans les entreprises a fait que le besoin de consolider ces donnes dans un seul type de stockage
est devenu important. On parle ici de mutualisation de stockage. SQL Server 2008 rpond cette problmatique en
proposant une nouvelle fonctionnalit : FILESTREAM.
IV - Installation et configuration
Par dfaut FILESTREAM est dsactiv lors de l'installation de SQL Server. Il est possible d'activer cette fonctionnalit
de plusieurs faons :
La 1re tape consiste activer FILESTREAM par le gestionnaire de configuration de SQL Server en allant dans
les proprits du service SQL Server ou par la commande TSQL sp_filestream_configure. Il existe plusieurs niveaux
d'accs :
-3Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/
Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)
Activer FILESTREAM pour l'accs TSQL : Ce niveau d'accs permet la gestion des donnes FILESTREAM
directement par le langage TSQL.
Activer FILESTREAM pour l'accs en continu aux E/S de fichier : Ce niveau d'accs permet la gestion
des donnes FILESTREAM et par TSQL et par l'API Win32 mais en local sur le serveur. Un nom partage
Windows sera galement configur.
Autoriser les clients distants avoir un accs en continu aux donnes FILESTREAM : Ce dernier
niveau d'accs permet l'accs aux fichiers par TSQL et par l'API Win32 pour les clients distants.
Dans le cas d'une activation FILESTREAM post-installation il faut galement configurer les niveaux d'accs au niveau
de l'instance SQL Server soit par la console SSMS dans les proprits du serveur soit directement par la commande
TSQL sp_configure.
-4Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/
Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)
EXEC sp_configure 'filestream_access_level', 2;
GO
RECONFIGURE
GO
Les valeurs que peut prendre l'option "filestream access level" sont :
0 : (FILESTREAM dsactive)
1 : (FILESTREAM activ pour TSQL)
2 : (FILESTREAM activ pour TSQL et Win32)
V - Utilisation de FILESTREAM
Pour utiliser FILESTREAM, il faut crer et allouer un groupe de fichiers spcial. Celui-ci peut tre cr la cration
de la base de donnes ou ajout si la base de donnes existe dj. La clause CONTAINS FILESTREAM doit tre
utilise lors de la cration du groupe de fichiers pour FILESTREAM.
CREATE DATABASE [filestream_database]
ON PRIMARY
( NAME = N'filestream_data', FILENAME = N'E:\MSSQL\DATA\filestream_data.mdf' , SIZE = 102400KB ,
MAXSIZE = UNLIMITED, FILEGROWTH = 51200KB ),
FILEGROUP [FILESTREAM_GRP] CONTAINS FILESTREAM DEFAULT
( NAME = N'filestream_ds', FILENAME = N'E:\MSSQL\FILESTREAM' )
LOG ON
( NAME = N'filestream_log', FILENAME = N'E:\MSSQL\DATA\filestream.ldf' , SIZE = 51200KB , MAXSIZE =
2048GB , FILEGROWTH = 20480KB )
GO
Pour un groupe de fichiers FILESTREAM, FILENAME fait rfrence un chemin d'accs. Tous les dossiers
constituant le chemin doivent exister sauf le dernier. Dans le cas de l'exemple ci-dessus, le dossier FILESTREAM
ne doit pas exister.
La requte suivante permet de vrifier la cration du groupe de fichiers de stockage FILESTREAM_GRP pour la
base de donnes filestream_database :
USE filestream_database;
GO
SELECT
m.file_id,
m.type_desc,
g.name AS [filegroup_name],
m.name AS [file_name],
m.physical_name
FROM sys.master_files m
INNER JOIN sys.filegroups g
ON m.data_space_id = g.data_space_id
WHERE database_id = DB_ID();
-5Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/
Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)
Le fichier filestream.hdr est un fichier systme important car il contient les informations d'en-ttes du stockage
FILESTREAM. Il ne doit pas tre supprim. Le dossier $FSLOG est, quant lui, l'quivalent du journal des
transactions d'une base de donnes pour FILESTREAM. Cette nouvelle fonctionnalit supporte et gre la notion de
transaction applique aux mme donnes relationnelles.
Colonne [DocID] : Les donnes de cette colonne sont de type uniqueidentifier. Ceci est ncessaire pour
l'utilisation de FILESTREAM avec l'API Win32.
Colonne [DocExtension] : Cette colonne contiendra les extensions d'un document insr. Elle est utile pour la
recherche FullText (Voir plus loin dans l'article).
Colonne [Doc] : Cette colonne stockera les documents. Elle est de type VARBINARY(MAX) et possde la
proprit FILESTREAM.
Utilisation de la clause FILESTREAM_ON qui dfinit le stockage des documents sur le groupe de fichiers
ddi que l'on a cr prcdemment.
Il faut maintenant insrer des documents dans la table [Documents]. Il s'agit de 3 documents de la suite microsoft
Office .
-6Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/
Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)
Document office Word 2007 avec pour contenu la phrase "Document office Word"
-- Variable de type image
DECLARE @img AS VARBINARY(MAX)
-- Chargement du document (chemin c:\)
SELECT @img = CAST(bulkcolumn AS VARBINARY(MAX))
FROM OPENROWSET(
BULK 'C:\Word.docx', SINGLE_BLOB) AS x
Insertion des documents dans la table
Document word 2007
INSERT INTO dbo.Documents (DocID, DocNumber, DocName, DocDescription, DocExtension, Doc)
VALUES (NEWID(), 'doc1','word','Document office word','.docx', @img);
Document office Excel 2007 avec pour contenu la phrase "Document office Excel 2007"
-- Chargement du document (chemin c:\)
SELECT @img = CAST(bulkcolumn AS VARBINARY(MAX))
FROM OPENROWSET(
BULK 'C:\Excel.xlsx', SINGLE_BLOB) AS x
Insertion des documents dans la table
Document excel 2007
INSERT INTO dbo.Documents (DocID, DocNumber, DocName, DocDescription, DocExtension, Doc)
VALUES (NEWID(), 'doc2','excel','Document office excel','.xlsx', @img);
Document office Excel 2003 avec pour contenu la phrase "Document office Excel 2003"
-- Chargement du document (chemin c:\)
SELECT @img = CAST(bulkcolumn AS VARBINARY(MAX))
FROM OPENROWSET(
BULK 'C:\Excel.xls', SINGLE_BLOB) AS x
-- Insertion des documents dans la table
-- Document excel 2003
INSERT INTO dbo.Documents (DocID, DocNumber, DocName, DocDescription, DocExtension, Doc)
VALUES (NEWID(), 'doc3','excel 2003','Document office excel 2003','.xls', @img);
-7Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/
Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)
Image jpeg :
-- Chargement du document (chemin c:\)
SELECT @img = CAST(bulkcolumn AS VARBINARY(MAX))
FROM OPENROWSET(
BULK 'C:\image.jpg', SINGLE_BLOB) AS x
--Insertion des documents dans la table Image jpeg
INSERT INTO dbo.Documents (DocID, DocNumber, DocName, DocDescription, DocExtension, Doc)
VALUES (NEWID(), 'img1','image1','Image Jpeg','.jpg', @img);
Voici le rsultat :
Cependant la manipulation des donnes FILESTREAM l'aide du langage TSQL est limite. Il permet de manipuler
des donnes FILESTREAM en utilisant les ordres DML classiques (INSERT, UPDATE, DELETE).
SQL Server fournit galement 2 autres mthodes utilisables directement via l'API Win32 pour la manipulation des
fichiers par une application cliente :
-8Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/
Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)
PathName() : Avant d'accder au fichier une application cliente doit connatre le chemin d'accs de ce
fichier. Cette mthode retourne le chemin d'accs en tant que jeton un objet blob directement utilisable par
l'application cliente.
SELECT
DocName,
Doc.PathName() AS DocPath
FROM dbo.Documents;
donnera :
Extrait d'un code client permettant la rcupration d'un fichier avec FILESTREAM
Imports System
Imports System.IO
Imports System.Text
'Chaine de connexion la base
Dim ConStr As String
ConStr = "Data Source=SRV-SQL2008;Initial Catalog=filestream_database;Integrated Security=True"
Dim con As New SqlConnection(ConStr)
con.Open()
' Slection du document Word 2007
Dim sqlCommand As New SqlCommand()
sqlCommand.Connection = con
sqlCommand.CommandText = "SELECT Doc FROM dbo.Documents WHERE DocID = 'doc1'"
Dim buffer As Byte() = sqlCommand.ExecuteScalar()
' Utilisation de la mmoire comme magasin de stockage du fichier
Dim ms As MemoryStream = New MemoryStream(buffer)
' ... Traitement du document
'Fermeture connexion
con.Close()
-9Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/
Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)
SELECT *
FROM dbo.Documents
WHERE FREETEXT (Doc, 'Excel')
SELECT *
FROM dbo.Documents
WHERE CONTAINS (Doc, '"FILESTREAM" AND "WORD"')
X - Points importants
FILESTREAM ne peut pas tre utilis en mirroring, ce qui peut tre regrettable pour des environnements de
haute disponibilit.
Des topologies de rplication ou de log shipping avec FILESTREAM ncessitent l'utilisation d'une version
SQL Server 2008 pour tous les serveurs et/ou ordinateurs concerns.
Dans un environnement cluster, le groupe de fichiers de stockage pour FILESTREAM doit se trouver sur un
disque partag.
- 10 Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/
Introduction FILESTREAM avec SQL Server 2008 par David BARBARIN (http://mikedavem.developpez.com/) (Blog)
FILESTREAM ne fonctionne pas avec les snapshots de bases de donnes. L'accs aux donnes causera
une erreur dans ce cas.
L'instance SQL Server doit tre configure avec la scurit intgre Windows pour FILESTREAM si le niveau
d'accs configur autorise la manipulation des donnes via l'API Win32.
XI - Bonnes pratiques
Microsoft, dans sa documentation, prconise certaines bonnes pratiques adopter concernant la configuration et la
maintenance des volumes NTFS pour FILESTREAM. Voici les plus importantes :
XII - Conclusion
SQL Server 2008 avec FILESTREAM propose de nouvelles fonctionnalits quant la gestion des donnes non
relationnelles. Cette nouvelle technologie apporte des avantages non ngligeables comme la capacit de stockage de
donnes htrognes, la gestion des fichiers directement par le cache systme Windows pour plus de performances
ou encore la garantie d'intgrit des donnes par une gestion transactionnelle de ces fichiers. FILESTREAM ouvre
donc la voie de futurs dveloppements d'applications intressants !!
- 11 Copyright 2009 - David BARBARIN. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes,
documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E
de dommages et intrts.
http://mikedavem.developpez.com/tutoriels/sqlserver/2008/introduction-filestream-avec-sql-server-2008/