Vue d'ensemble de FILESTREAM

Une grande partie des données créées tous les jours sont des données non structurées, telles que des documents texte, des images et des vidéos. Ces données non structurées sont souvent stockées en dehors de la base de données, à l'écart des données structurées. Cette séparation peut compliquer la gestion des données. Ou, si les données sont associées à du stockage structuré, les capacités et les performances de diffusion de fichiers en continu peuvent être limitées.

FILESTREAM intègre le Moteur de base de données SQL Server avec un système de fichiers NTFS en stockant les données d'objet blob varbinary(max) en tant que fichiers dans 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 l'accès de diffusion en continu aux données.

FILESTREAM utilise le cache système NT pour mettre en cache les données de fichiers. Cela aide à 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 de requête.

[!REMARQUE]

Les données FILESTREAM ne sont pas chiffrées, même lorsque le chiffrement transparent des données est activé.

Pour une procédure pas à pas qui indique comment utiliser FILESTREAM, consultez Mise en route du stockage FILESTREAM.

À quel moment utiliser FILESTREAM

Dans SQL Server, les objets blob peuvent être des données varbinary(max) standard qui stockent les données dans des tables, ou des objets varbinary(max)FILESTREAM 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 du stockage de base de données ou du stockage de système de fichiers. Si les conditions suivantes sont remplies, vous devez envisager d'utiliser FILESTREAM :

  • La taille des objets stockés est, en moyenne, supérieure à 1 Mo.

  • L'accès en lecture rapide est important.

  • Vous développez des applications qui utilisent une couche intermédiaire pour la logique d'application.

Pour les plus petits objets, le stockage des objets blob varbinary(max) dans la base de données procure souvent de meilleures performances de diffusion en continu.

Stockage FILESTREAM

Le stockage FILESTREAM est implémenté en tant que colonne varbinary(max) dans laquelle les données sont stockées comme objet blob dans le système de fichiers. Les tailles des objets blob sont limitées uniquement par la taille de volume du système de fichiers. La limitation varbinary(max) standard de 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 dans le système de fichiers, spécifiez l'attribut FILESTREAM sur une colonne varbinary(max). Le Moteur de base de données stocke alors toutes les données pour cette colonne dans 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 portent le nom de conteneurs de données. Les conteneurs de données sont l'interface entre le stockage de Moteur de base de données et le stockage de système de fichiers.

Lorsque vous utilisez le stockage FILESTREAM, considérez les éléments suivants :

  • Lorsqu'une table contient une colonne FILESTREAM, chaque ligne doit avoir un ID de ligne unique n'acceptant pas la valeur Null.

  • Les conteneurs de données FILESTREAM ne peuvent pas être imbriqués.

  • Lorsque vous utilisez la gestion des clusters de basculement, les groupes de fichiers FILESTREAM doivent être sur des ressources de disque partagées.

  • Les groupes de fichiers FILESTREAM peuvent être sur des volumes compressés.

Sécurité intégrée

Dans SQL Server, les données FILESTREAM sont sécurisées tout comme les autres données : en accordant des autorisations au niveau des tables ou des colonnes. Si un utilisateur dispose de l'autorisation pour la colonne FILESTREAM dans une table, il 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 dispose des autorisations NTFS sur le conteneur FILESTREAM. Nous recommandons de n'accorder des autorisations sur le conteneur de données à aucun autre compte.

Gestion intégrée

FILESTREAM étant implémenté en tant que colonne varbinary(max) et intégré directement dans le Moteur de base de données, la plupart des fonctions et outils d'administration SQL Server fonctionnent sans changement pour les données FILESTREAM. Par exemple, vous pouvez utiliser tous les modes de récupération et de sauvegarde avec les 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 les données FILESTREAM avec les données relationnelles, vous pouvez utiliser une sauvegarde partielle pour exclure les groupes de fichiers FILESTREAM.

Modèle de programmation double pour accéder aux données d'objet blob

Après avoir stocké des données dans une colonne FILESTREAM, vous pouvez accéder aux fichiers en utilisant des transactions Transact-SQL ou en utilisant des API Win32.

Accès Transact-SQL

Grâce à 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 diffusée en continu plus efficacement 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 segmentée Transact-SQL, implémentée comme 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 d'objet blob sous-jacentes dans le système de fichiers.

Accès de diffusion en continu au système de fichiers

La prise en charge de 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 d'accès de système de fichiers UNC logique d'un fichier. Vous utilisez ensuite l'API OpenSqlFilestream pour obtenir un descripteur de fichier. Ce descripteur peut ensuite être utilisé par des interfaces de diffusion de fichiers en continu Win32, telles que ReadFile() et WriteFile(), afin d'accéder au fichier et de le mettre à jour par le biais du système de fichiers.

Les opérations de fichiers étant transactionnelles, vous ne pouvez pas supprimer ou renommer des fichiers FILESTREAM par le biais du système de fichiers.

Modèle d'instruction

L'accès au système de fichiers FILESTREAM modèle une instruction Transact-SQL en utilisant l'ouverture et la fermeture de fichier. L'instruction démarre lorsqu'un descripteur de fichier est ouvert et se termine lorsque le descripteur est fermé. Par exemple, lorsqu'un descripteur d'écriture est fermé, tout déclencheur AFTER possible enregistré sur la table est activé comme si une instruction UPDATE était effectué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 d'objet blob. Une nouvelle fonction intrinsèque, PathName, fournit le chemin UNC logique de l'objet blob qui correspond à chaque cellule FILESTREAM dans la table. L'application utilise ce chemin logique pour obtenir le descripteur Win32 et opérer sur les données d'objet blob en utilisant des interfaces de système de fichiers Win32 ordinaires. La fonction retourne NULL si la valeur de la colonne FILESTREAM est NULL.

Accès au système de fichiers traité

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 mais pas encore abandonnée ou validée. En obtenant un jeton, l'application lie les opérations de diffusion en continu de système de fichiers FILESTREAM avec une transaction commencée. La fonction retourne NULL si aucune transaction n'est explicitement commencée.

Tous les descripteurs de fichiers doivent être fermés avant que la transaction ne soit validée ou abandonnée. Si un descripteur est laissé ouvert au-delà de l'étendue de transaction, les lectures supplémentaires contre le descripteur provoqueront un échec ; les écritures supplémentaires contre le descripteur réussiront, mais les données effectives ne seront 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 descripteurs ouverts sont invalidés.

Durabilité transactionnelle

Avec FILESTREAM, lors de la validation des transactions, le Moteur de base de données garantit la durabilité des transactions pour les données d'objet blob FILESTREAM modifiées à partir de l'accès en continu au système de fichiers.

Sémantique d'isolation

La sémantique d'isolation est gouvernée par les niveaux d'isolation des transactions du Moteur de base de données. Seul le niveau d'isolation de lecture validée est pris en charge pour l'accès au système de fichiers. Les opérations de lecture répétables, et également les isolations sérialisables et de capture instantanée, sont pris en charge lorsque les données FILESTREAM sont accédées à l'aide de Transact-SQL. La lecture erronée 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 d'ouverture échouent immédiatement si elles ne peuvent pas accéder aux données à cause de l'isolation des transactions. Les appels API de diffusion en continu échouent avec ERROR_SHARING_VIOLATION si l'opération d'ouverture ne peut se poursuivre à cause de la violation d'isolation.

Mises à jour partielles

Pour permettre les mises à jour partielles, l'application peut publier un contrôle FS de périphérique (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) afin d'extraire l'ancien contenu dans le fichier auquel le descripteur ouvert fait référence. Cela déclenchera une copie de l'ancien contenu côté serveur. Pour de meilleures performances d'application et afin d'éviter des dépassements de délais d'attente potentiels lorsque vous travaillez avec de très grands fichiers, nous vous recommandons d'utiliser des E/S asynchrones.

Si le FSCTL est publié après l'écriture dans le descripteur, la dernière opération d'écriture persistera et les écritures antérieures effectuées dans le descripteur seront perdues.

Double écriture à partir de clients distants

L'accès de système de fichiers distant aux données FILESTREAM est activé sur le protocole SMB (Block Server Message). Si le client est distant, aucune opération d'écriture n'est mise en cache par le côté client. Les opérations d'écriture seront toujours envoyées au serveur. Les données peuvent être mises en cache du côté serveur. Nous recommandons que les applications qui s'exécutent sur des clients distants consolident les petites opérations d'écriture afin d'effectuer moins d'opérations d'écriture avec une taille de données supérieure.

La création de vues mappées en mémoire (E/S mappées en mémoire) à l'aide d'un descripteur FILESTREAM n'est pas prise en charge. Si le mappage 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, ni l'intégrité de la base de données.