{"id":367,"date":"2012-03-22T00:00:31","date_gmt":"2012-03-22T00:00:31","guid":{"rendered":"http:\/\/www.sqlserver.fr\/blog\/?p=367"},"modified":"2026-05-02T14:31:16","modified_gmt":"2026-05-02T12:31:16","slug":"presentation-du-type-filetable","status":"publish","type":"post","link":"https:\/\/www.sqlserver.fr\/blog\/presentation-du-type-filetable\/","title":{"rendered":"Pr\u00e9sentation du type FileTable"},"content":{"rendered":"<p>Un petit papier pour pr\u00e9senter dans les grandes lignes une nouvelle fonctionnalit\u00e9 de SQL Server 2012 nomm\u00e9e FileTable et qui permet d\u2019int\u00e9grer directement dans la base de donn\u00e9es une arborescence de r\u00e9pertoire. Ca ressemble au FileStream d\u00e9j\u00e0 introduit en SQL Server 2008, mais il n\u2019y a cette fois-ci plus besoin de passer par une API d\u00e9di\u00e9e pour acc\u00e9der aux donn\u00e9es, la plupart des programmes d\u2019\u00e9dition de fichiers permettent d\u2019agir directement sur ces donn\u00e9es.<!--more--><br \/>\nDu point de vue des \u00e9tapes pr\u00e9paratoires, il convient tout d\u2019abord de param\u00e9trer le FileStream. Pour cela, il convient :<\/p>\n<ul>\n<li>De l\u2019activer<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0014.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-368\" title=\"image001\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0014.jpg\" alt=\"\" width=\"605\" height=\"543\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0014.jpg 605w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0014-300x269.jpg 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/a><\/p>\n<ul>\n<li>De fournir un chemin de stockage ad\u00e9quat sur la base de donn\u00e9es sur laquelle on souhaite l\u2019utiliser<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0022.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-369\" title=\"image002\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0022.jpg\" alt=\"\" width=\"605\" height=\"492\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0022.jpg 605w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0022-300x243.jpg 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/a><br \/>\nUne fois que ces param\u00e8tres sont en place, vous pouvez directement cr\u00e9er un nouveau type de table : une FileTable.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">CREATE TABLE [dbo].[MaFileTable] AS FILETABLE ON [PRIMARY] FILESTREAM_ON [FG_FILESTREAM]\r\nWITH\r\n(\r\nFILETABLE_DIRECTORY = N'Repertoire_MaFileTable', FILETABLE_COLLATE_FILENAME = French_CI_AS\r\n)<\/pre>\n<p>A partir de l\u00e0, un partage r\u00e9seau est accessible, correspondant \u00e0 la table qui vient d\u2019\u00eatre cr\u00e9\u00e9e.<br \/>\n<a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0031.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-370\" title=\"image003\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0031.jpg\" alt=\"\" width=\"605\" height=\"398\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0031.jpg 605w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0031-300x197.jpg 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/a><br \/>\nEt ce partage est d\u00e9sormais accessible de mani\u00e8re quasiment transparente. On peut \u00eatre cr\u00e9er des dossiers et sous-dossiers, y positionner tout type de fichiers (Word, TXT, MP3, AVI\u2026), qui pourront \u00eatre acc\u00e9d\u00e9s par les programmes habituels.<br \/>\n<a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0041.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-371\" title=\"image004\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0041.jpg\" alt=\"\" width=\"605\" height=\"383\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0041.jpg 605w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0041-300x189.jpg 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/a><br \/>\nEt au final, comment cela est-ce stock\u00e9 ? Et bien la table que nous venons de cr\u00e9er n\u2019est rien d\u2019autre qu\u2019une table standard, avec une structure bien d\u00e9finie :<br \/>\n<a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0052.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-372\" title=\"image005\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0052.png\" alt=\"\" width=\"461\" height=\"664\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0052.png 461w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0052-208x300.png 208w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/a><a href=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0061.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-373\" title=\"image006\" src=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0061.jpg\" alt=\"\" width=\"604\" height=\"94\" srcset=\"https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0061.jpg 604w, https:\/\/www.sqlserver.fr\/blog\/wp-content\/uploads\/2012\/03\/image0061-300x46.jpg 300w\" sizes=\"auto, (max-width: 604px) 100vw, 604px\" \/><\/a><\/p>\n<p>Chaque fichier ou r\u00e9pertoire est identifi\u00e9 par un identifiant. Derri\u00e8re cela, nous avons principalement :<\/p>\n<ul>\n<li>le contenu du fichier (file_stream), sous forme de VARBINARY(MAX), pouvant donc contenir jusqu\u2019\u00e0 2Go de donn\u00e9es<\/li>\n<li>le nom du fichier ou du r\u00e9pertoire<\/li>\n<li>l\u2019indicateur de chemin d\u2019acc\u00e8s, et du dossier parent, sous forme d\u2019expression binaire de type hierarchyId.<\/li>\n<li>les diverses propri\u00e9t\u00e9s du fichier (type, date-heure de cr\u00e9ation, propri\u00e9t\u00e9s Lecture Seule, Syst\u00e8me, Archive, &#8230;)<\/li>\n<\/ul>\n<p>Le fait d\u2019avoir ce stockage sous forme de table permet notamment de ne plus avoir \u00e0 g\u00e9rer un syst\u00e8me de sauvegarde s\u00e9par\u00e9 pour ces fameux fichiers. Tout est dans le backup standard de la base de donn\u00e9es, avec tous les avantages que cela peut procurer (compression, sauvegardes diff\u00e9rentielles, \u2026).<br \/>\nDe plus, \u00e9tant donn\u00e9 que les diff\u00e9rentes informations g\u00e9n\u00e9rales des fichiers sont disponibles, il est d\u00e9sormais possible de r\u00e9aliser des scripts T-SQL qui viendront directement purger les donn\u00e9es obsol\u00e8tes, sans avoir \u00e0 g\u00e9rer cela sous forme de traitement MS-DOS ou PowerShell.<br \/>\nEn r\u00e9sum\u00e9, il s\u2019agit l\u00e0 d\u2019une fonctionnalit\u00e9 \u00e0 consid\u00e9rer plus que s\u00e9rieusement\u2026<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un petit papier pour pr\u00e9senter dans les grandes lignes une nouvelle fonctionnalit\u00e9 de SQL Server 2012 nomm\u00e9e FileTable et qui permet d\u2019int\u00e9grer directement dans la base de donn\u00e9es une arborescence de r\u00e9pertoire. Ca ressemble au FileStream d\u00e9j\u00e0 introduit en SQL &hellip; <a href=\"https:\/\/www.sqlserver.fr\/blog\/presentation-du-type-filetable\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-367","post","type-post","status-publish","format-standard","hentry","category-article_sql"],"_links":{"self":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/comments?post=367"}],"version-history":[{"count":14,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/367\/revisions"}],"predecessor-version":[{"id":1958,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/367\/revisions\/1958"}],"wp:attachment":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/media?parent=367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/categories?post=367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/tags?post=367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}