Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
FILESTREAM permet aux applications SQL Server de stocker des données non structurées, telles que des documents et des images, sur le système de fichiers. Les applications peuvent tirer parti des API de diffusion en continu enrichies et des performances du système de fichiers et, en même temps, maintenir la cohérence transactionnelle entre les données non structurées et les données structurées correspondantes.
FILESTREAM intègre le moteur de base de données SQL Server à un système de fichiers NTFS en stockant des varbinary(max) données blob (binary large object) en tant que fichiers sur le système de fichiers. Les instructions Transact-SQL peuvent insérer, mettre à jour, interroger, rechercher et sauvegarder des données Filestream. Les interfaces de système de fichiers Win32 fournissent un accès en streaming aux données.
FILESTREAM utilise le cache système NT pour la mise en cache des données de fichier. Cela permet de réduire tout effet que les données FILESTREAM peuvent avoir sur les performances du moteur de base de données. Le pool de mémoires tampons SQL Server n’est pas utilisé ; par conséquent, cette mémoire est disponible pour le traitement des requêtes.
FILESTREAM n’est pas activé automatiquement lorsque vous installez ou mettez à niveau SQL Server. Vous devez activer FILESTREAM à l’aide du Gestionnaire de configuration SQL Server et de SQL Server Management Studio. Pour utiliser FILESTREAM, vous devez créer ou modifier une base de données pour contenir un type spécial de groupe de fichiers. Ensuite, créez ou modifiez une table pour qu’elle contienne une varbinary(max) colonne avec l’attribut FILESTREAM. Une fois ces tâches terminées, vous pouvez utiliser Transact-SQL et Win32 pour gérer les données FILESTREAM.
Pour plus d’informations sur l’installation et l’utilisation de FILESTREAM, consultez la liste des tâches associées.
Quand utiliser FILESTREAM
Dans SQL Server, les objets blob peuvent être des données standard varbinary(max) qui stockent les données dans des tables ou des objets FILESTREAM varbinary(max) qui stockent les données dans le système de fichiers. La taille et l’utilisation des données déterminent si vous devez utiliser le stockage de base de données ou le stockage du système de fichiers. Si les conditions suivantes sont remplies, vous devez envisager d’utiliser FILESTREAM :
Les objets stockés sont, en moyenne, supérieurs à 1 Mo.
L’accès en lecture rapide est important.
Vous développez des applications qui utilisent un niveau intermédiaire pour la logique d’application.
Pour les objets plus petits, stocker les varbinary(max) BLOBs dans la base de données offre souvent de meilleures performances de streaming.
Stockage FILESTREAM
Le stockage FILESTREAM est implémenté dans une colonne varbinary(max), où les données sont stockées en tant que BLOBs dans le système de fichiers. Les tailles des objets blob sont limitées uniquement par la taille du volume du système de fichiers. La limitation standard varbinary(max) des tailles de fichiers de 2 Go ne s’applique pas aux objets blob stockés dans le système de fichiers.
Pour spécifier qu’une colonne doit stocker des données sur le système de fichiers, spécifiez l’attribut FILESTREAM sur une varbinary(max) colonne. Ainsi, le moteur de base de données stocke toutes les données de cette colonne sur le système de fichiers, mais pas dans le fichier de base de données.
Les données FILESTREAM doivent être stockées dans des groupes de fichiers FILESTREAM. Un groupe de fichiers FILESTREAM est un groupe de fichiers spécial qui contient des répertoires de système de fichiers au lieu des fichiers eux-mêmes. Ces répertoires de système de fichiers sont appelés conteneurs de données. Les conteneurs de données sont l’interface entre le stockage du moteur de base de données et le stockage du système de fichiers.
Lorsque vous utilisez le stockage FILESTREAM, tenez compte des éléments suivants :
Lorsqu’une table contient une colonne FILESTREAM, chaque ligne doit avoir un ID de ligne unique non inexistant.
Plusieurs conteneurs de données peuvent être ajoutés à un groupe de fichiers FILESTREAM.
Les conteneurs de données FILESTREAM ne peuvent pas être imbriqués.
Lorsque vous utilisez le clustering de basculement, les groupes de fichiers FILESTREAM doivent se trouver sur des ressources de disque partagé.
Les groupes de fichiers FILESTREAM peuvent se trouver sur des volumes compressés.
Gestion intégrée
Étant donné que FILESTREAM est implémenté en tant que varbinary(max) colonne et intégré directement au moteur de base de données, la plupart des outils et fonctions de gestion SQL Server fonctionnent sans modification pour les données FILESTREAM. Par exemple, vous pouvez utiliser tous les modèles de sauvegarde et de récupération avec des données FILESTREAM, et les données FILESTREAM sont sauvegardées avec les données structurées dans la base de données. Si vous ne souhaitez pas sauvegarder des données FILESTREAM avec des données relationnelles, vous pouvez utiliser une sauvegarde partielle pour exclure les groupes de fichiers FILESTREAM.
Sécurité intégrée
Dans SQL Server, les données FILESTREAM sont sécurisées comme d’autres données : en accordant des autorisations aux niveaux de table ou de colonne. Si un utilisateur est autorisé à accéder à la colonne FILESTREAM dans une table, l’utilisateur peut ouvrir les fichiers associés.
Remarque
Le chiffrement n’est pas pris en charge sur les données FILESTREAM.
Seul le compte sous lequel le compte de service SQL Server s’exécute reçoit des autorisations NTFS pour le conteneur FILESTREAM. Nous vous recommandons de ne pas accorder d’autorisations à tout autre compte sur le conteneur de données.
Remarque
Les connexions SQL ne fonctionnent pas avec les conteneurs FILESTREAM. Seule l’authentification NTFS fonctionne avec les conteneurs FILESTREAM.
Accès aux données BLOB avec Transact-SQL et accès au streaming du système de fichiers
Après avoir stocké des données dans une colonne FILESTREAM, vous pouvez accéder aux fichiers à l’aide de transactions Transact-SQL ou à l’aide d’API Win32.
Accès Transact-SQL
À l’aide de Transact-SQL, vous pouvez insérer, mettre à jour et supprimer des données FILESTREAM :
Vous pouvez utiliser une opération d’insertion pour préremplir un champ FILESTREAM avec une valeur Null, une valeur vide ou des données inline relativement courtes. Toutefois, une grande quantité de données est plus efficacement diffusée dans un fichier qui utilise des interfaces Win32.
Lorsque vous mettez à jour un champ FILESTREAM, vous modifiez les données d'objet blob sous-jacentes dans le système de fichiers. Lorsqu'un champ FILESTREAM a la valeur NULL, les données d'objet blob associées au champ sont supprimées. Vous ne pouvez pas utiliser une mise à jour Transact-SQL segmentée, implémentée en tant que UPDATE**.*Write(), pour effectuer des mises à jour partielles des données.
Lorsque vous supprimez une ligne ou supprimez ou tronquez une table qui contient des données FILESTREAM, vous supprimez les données BLOB sous-jacentes dans le système de fichiers.
Accès au streaming du système de fichiers
La prise en charge de la diffusion en continu Win32 fonctionne dans le contexte d’une transaction SQL Server. Dans une transaction, vous pouvez utiliser des fonctions FILESTREAM pour obtenir un chemin de système de fichiers UNC logique d’un fichier. Vous utilisez ensuite l’API OpenSqlFilestream pour obtenir un handle de fichier. Ce handle peut ensuite être utilisé par les interfaces de streaming de fichiers Win32, telles que ReadFile() et WriteFile(), pour accéder au fichier et la mettre à jour à l’aide du système de fichiers.
Étant donné que les opérations de fichier sont transactionnelles, vous ne pouvez pas supprimer ou renommer des fichiers FILESTREAM via le système de fichiers.
Modèle de déclaration
Le système de fichiers FILESTREAM modélise une instruction Transact-SQL en utilisant l'ouverture et la fermeture de fichiers. L’instruction démarre lorsqu’un handle de fichier est ouvert et se termine lorsque le handle est fermé. Par exemple, lorsqu'un handle d'écriture est fermé, tout déclencheur AFTER possible inscrit sur la table se déclenche comme si une instruction UPDATE avait été terminée.
Espace de noms de stockage
Dans FILESTREAM, le moteur de base de données contrôle l’espace de noms du système de fichiers physique BLOB. Une nouvelle fonction intrinsèque , PathName, fournit le chemin UNC logique du blob qui correspond à chaque cellule FILESTREAM du tableau. L’application utilise ce chemin logique pour obtenir le handle Win32 et exploiter les données BLOB à l’aide d’interfaces de système de fichiers Win32 standard. La fonction retourne NULL si la valeur de la colonne FILESTREAM est NULL.
Accès au système de fichiers transactionné
Une nouvelle fonction intrinsèque, GET_FILESTREAM_TRANSACTION_CONTEXT(), fournit le jeton qui représente la transaction actuelle à laquelle la session est associée. La transaction doit avoir été démarrée et n’a pas encore été abandonnée ou validée. En obtenant un jeton, l’application lie les opérations de streaming du système de fichiers FILESTREAM à une transaction démarrée. La fonction retourne NULL en cas de non transaction démarrée explicitement.
Tous les handles de fichier doivent être fermés avant la validation ou l’abandon de la transaction. Si un handle est laissé ouvert au-delà de l’étendue de la transaction, des lectures supplémentaires sur le handle entraînent un échec ; des écritures supplémentaires sur le handle réussissent, mais les données réelles ne sont pas écrites sur le disque. De même, si la base de données ou l’instance du moteur de base de données s’arrête, tous les handles ouverts sont invalidés.
Durabilité transactionnelle
Avec FILESTREAM, une fois la transaction validée, le moteur de base de données garantit la durabilité de la transaction pour les données BLOB FILESTREAM modifiées à partir de l'accès en flux du système de fichiers.
Sémantique d’isolation
La sémantique d’isolation est régie par les niveaux d’isolation des transactions du moteur de base de données. Le niveau d’isolation en lecture validée est pris en charge pour Transact-SQL et l’accès au système de fichiers. Les opérations de lecture répétée, ainsi que les isolements instantanés et sérialisables, sont pris en charge. La lecture incorrecte n’est pas prise en charge.
Les opérations d’ouverture d’accès au système de fichiers n’attendent pas de verrous. Au lieu de cela, les opérations ouvertes échouent immédiatement s’ils ne peuvent pas accéder aux données en raison de l’isolation des transactions. Les appels d’API de streaming échouent avec ERROR_SHARING_VIOLATION si l’opération ouverte ne peut pas continuer en raison d’une violation d’isolation.
Pour permettre l’exécution de mises à jour partielles, l’application peut émettre un contrôle FS d’appareil (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) pour extraire l’ancien contenu dans le fichier auquel le handle ouvert fait référence. Cela déclenche une ancienne copie de contenu côté serveur. Pour améliorer les performances de l’application et éviter de rencontrer des délais d’attente potentiels lorsque vous travaillez avec des fichiers très volumineux, nous vous recommandons d’utiliser des E/S asynchrones.
Si le FSCTL est émis après l’écriture du handle, la dernière opération d’écriture est conservée et les écritures antérieures qui ont été effectuées dans le handle sont perdues.
API du système de fichiers et niveaux d’isolation pris en charge
Lorsqu’une API du système de fichiers ne peut pas ouvrir un fichier en raison d’une violation d’isolation, une exception ERROR_SHARING_VIOLATION est retournée. Cette violation d’isolation se produit lorsque deux transactions tentent d’accéder au même fichier. Le résultat de l’opération d’accès dépend du mode dans lequel le fichier a été ouvert et de la version de SQL Server sur laquelle la transaction s’exécute. Le tableau suivant présente les résultats possibles pour deux transactions qui accèdent au même fichier.
| Transaction 1 | Transaction 2 | Résultat sur SQL Server 2008 | Résultat sur SQL Server 2008 R2 et versions ultérieures |
|---|---|---|---|
| Ouvert à la lecture. | Ouvert pour lecture. | Les deux réussissent. | Les deux réussissent. |
| Ouvrir pour lecture. | Ouvert pour l'écriture. | Les deux réussissent. Les opérations d’écriture sous la transaction 2 n’affectent pas les opérations de lecture effectuées dans la transaction 1. | Les deux réussissent. Les opérations d’écriture sous la transaction 2 n’affectent pas les opérations de lecture effectuées dans la transaction 1. |
| Ouvert pour écriture. | Ouvert en mode lecture. | L’ouverture de la transaction 2 échoue avec une exception ERROR_SHARING_VIOLATION. | Les deux réussissent. |
| Ouvrir en mode écriture. | Ouvert en mode écriture. | L’ouverture de la transaction 2 échoue en raison d'une exception ERROR_SHARING_VIOLATION. | L’ouverture de la transaction 2 échoue avec une exception ERROR_SHARING_VIOLATION. |
| Ouvert en lecture. | Ouvert pour sélection. | Les deux réussissent. | Les deux réussissent. |
| Ouvert à la lecture. | Ouvrir pour mise à jour ou suppression. | Les deux réussissent. Les opérations d’écriture sous la transaction 2 n’affectent pas les opérations de lecture effectuées dans la transaction 1. | Les deux réussissent. Les opérations d’écriture sous la transaction 2 n’affectent pas les opérations de lecture effectuées dans la transaction 1. |
| Ouvrez pour l’écriture. | ouvert pour SELECT. | La transaction 2 bloque jusqu’à ce que la transaction 1 valide ou termine la transaction, ou que le verrou de transaction expire. | Les deux réussissent. |
| Ouvert pour écriture | Ouvert pour mise à jour ou suppression. | La transaction 2 bloque jusqu’à ce que la transaction 1 valide ou termine la transaction, ou que le verrou de transaction expire. | La transaction 2 bloque jusqu’à ce que la transaction 1 valide ou termine la transaction, ou que le verrou de transaction expire. |
| Ouvrir pour sélectionner. | Ouvrir pour lecture. | Les deux réussissent. | Les deux réussissent. |
| Ouvert pour SELECT. | Ouvrir pour écrire. | Les deux réussissent. Les opérations d’écriture sous la transaction 2 n’affectent pas la transaction 1. | Les deux réussissent. Les opérations d’écriture sous la transaction 2 n’affectent pas la transaction 1. |
| Ouvert pour UPDATE ou DELETE. | Ouvrir en lecture. | L'opération d'ouverture de la transaction 2 échoue avec une exception ERROR_SHARING_VIOLATION. | Les deux réussissent. |
| Ouvert pour UPDATE ou DELETE. | Ouvrez pour l’écriture. | L’opération d’ouverture sur la transaction 2 échoue avec une exception ERROR_SHARING_VIOLATION. | L’opération d’ouverture sur la transaction 2 échoue en raison d'une exception ERROR_SHARING_VIOLATION. |
| Ouvert pour SELECT avec lecture reproductible. | Ouvert pour lecture | Les deux réussissent. | Les deux réussissent. |
| Ouvert pour SELECT avec lecture réitérable. | Ouvert pour écriture. | L’opération d’ouverture sur la transaction 2 échoue avec une exception ERROR_SHARING_VIOLATION. | L’opération d’ouverture sur la transaction 2 échoue avec une exception ERROR_SHARING_VIOLATION. |
Write-Through à partir de clients distants
L’accès au système de fichiers distant aux données FILESTREAM est activé sur le protocole SMB (Server Message Block). Si le client est distant, aucune opération d’écriture n’est mise en cache côté client. Les opérations d’écriture sont toujours envoyées au serveur. Les données peuvent être mises en cache côté serveur. Nous recommandons aux applications qui s’exécutent sur des clients distants de consolider de petites opérations d’écriture pour faire moins d’opérations d’écriture à l’aide d’une plus grande taille de données.
La création de vues mappées en mémoire (E/S mappées en mémoire) à l’aide d’un handle FILESTREAM n’est pas prise en charge. Si le mappage de mémoire est utilisé pour les données FILESTREAM, le moteur de base de données ne peut pas garantir la cohérence et la durabilité des données ou l’intégrité de la base de données.
Tâches associées
Activer et configurer FILESTREAM
Créer une base de données FILESTREAM-Enabled
Créer une table pour le stockage de données FILESTREAM
Accéder aux données FILESTREAM avec Transact-SQL
Créer des applications clientes pour les données FILESTREAM
Accéder aux données FILESTREAM avec OpenSqlFilestream
Effectuer des mises à jour partielles des données FILESTREAM
Éviter les conflits avec les opérations de base de données dans les applications FILESTREAM
Déplacer une base de données FILESTREAM-Enabled
Configurer FILESTREAM sur un cluster de basculement automatique
Configurer un pare-feu pour l’accès FILESTREAM
Contenu associé
Compatibilité FILESTREAM avec d’autres fonctionnalités SQL Server