{"id":106,"date":"2011-04-20T20:56:42","date_gmt":"2011-04-20T18:56:42","guid":{"rendered":"http:\/\/www.flip-design.de\/?p=106"},"modified":"2011-04-20T21:06:12","modified_gmt":"2011-04-20T19:06:12","slug":"dokumenten-verwaltung-mit-filestream-und-der-volltextsuche","status":"publish","type":"post","link":"https:\/\/www.flip-design.de\/?p=106","title":{"rendered":"Dokumenten Verwaltung mit Filestream und der Volltextsuche"},"content":{"rendered":"<p><a href=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/Zeichnung1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignleft size-full wp-image-107\" title=\"filestream\" src=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/Zeichnung1.png\" alt=\"\" width=\"69\" height=\"73\" \/><\/a>In diesem Artikel geht es um die Speicherung von Dateien und dem Auffinden dieser im SQL Server. Um Dateien nicht komplett in der Datenbank zu speichern, bietet sich Filestream an. Bei dieser Technologie werden lediglich Meta Daten innerhalb der Datenbank gespeichert und die eigentliche Datei befindet sich in einem File-Share und werden dort physikalisch als Datei abgelegt. So spart man sich den Speicherplatz innerhalb der Datenbank.<br \/>\nUm diese Dateien aber auch wiederzufinden, bzw. nach dem Inhalt zu suchen, kann die Volltext-Indizierung eingesetzt werden.<\/p>\n<p><strong>Folgendes Fallbeispiel stellt sich:<\/strong><br \/>\nWir verf\u00fcgen \u00fcber verschiedenste Dokumente, bspw. im DOC, TXT und RTF Format die innerhalb der Datenbank im Filestream gespeichert und auch vollst\u00e4ndig durchsucht werden sollen<\/p>\n<p>Zu erst muss Filestream \u00fcber den SQL Server Configuration Manager aktiviert werden.<br \/>\nSiehe hierf\u00fcr BOL:<br \/>\n<a href=\"http:\/\/msdn.microsoft.com\/de-de\/library\/cc645923.aspx\">http:\/\/msdn.microsoft.com\/de-de\/library\/cc645923.aspx<\/a><\/p>\n<p>Zuerst brauchen wir eine Datenbank:<br \/>\n<code>CREATE DATABASE [<strong>DMS<\/strong>] ON  PRIMARY<br \/>\n( NAME = N'DMS',<br \/>\nFILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL\\MSSQL\\DATA\\DMS.mdf' ,<br \/>\nSIZE = 3072KB , FILEGROWTH = 1024KB )<br \/>\nLOG ON<br \/>\n( NAME = N'DMS_log',<br \/>\nFILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL\\MSSQL\\DATA\\DMS_log.ldf' ,<br \/>\nSIZE = 1024KB , FILEGROWTH = 10%)<br \/>\nGO<\/code><\/p>\n<p>Nun wird das Filestream Feature auf der Datenbank mit dem Access Level 2 (Zugriff auch von externen Ressourcen, wie bspw. .NET) aktiviert:<br \/>\n<code>EXEC sys.sp_configure N'filestream access level', N'2'<br \/>\nGO<br \/>\nRECONFIGURE WITH OVERRIDE<br \/>\nGO<\/code><\/p>\n<p>Nun wird eine weitere Dateigruppe f\u00fcr die Speicherung der Filestream Daten angelegt mit der entsprechenden Ressource. Hier wird auch konfiguriert, wo sich der Filestream Ordner im Netzwerk oder Lokal befindet:<br \/>\n<code>ALTER DATABASE [DMS] ADD FILEGROUP [dateien] CONTAINS FILESTREAM<br \/>\nGO<br \/>\nALTER DATABASE [DMS] ADD FILE ( NAME = N'Dateien', FILENAME = N'C:\\filestream\\Dateien' ) TO FILEGROUP [dateien]<br \/>\nGO<\/code><\/p>\n<p>Nun ben\u00f6tigen wir noch eine Tabelle in der die Daten gespeichert werden sollen:<br \/>\n<code>CREATE TABLE Dokumente (<br \/>\nuid uniqueidentifier default newid() not null primary key ROWGUIDCOL,<br \/>\nname varchar(255) not null,<br \/>\nerweiterung varchar(255) not null,<br \/>\ndatei varbinary(MAX) FILESTREAM NOT NULL,<br \/>\nhinzugefuegt datetime default getdate() not null)<br \/>\nON [PRIMARY] FILESTREAM_ON [dateien];<br \/>\nGO<\/code><\/p>\n<p>Um Filestream Daten speichern zu k\u00f6nnen, ist die Angabe von ROWGUIDCOL als Index notwendig.<\/p>\n<p>Nun werden noch 3 Dateien \u00fcber OPENROWSET hinzugef\u00fcgt:<br \/>\n<code>INSERT INTO dbo.Dokumente(name, erweiterung, datei)<br \/>\nSELECT<br \/>\n'Mein RTF Dokument' AS Name,<br \/>\n'rtf' AS Erweiterung,<br \/>\n* FROM OPENROWSET(BULK N'C:\\temp\\dokument.rtf', SINGLE_BLOB) AS datei;<br \/>\nGO<\/code><\/p>\n<p><code>INSERT INTO dbo.Dokumente(name, erweiterung, datei)<br \/>\nSELECT<br \/>\n'Word 2003 Dokument' AS Name,<br \/>\n'doc' AS Erweiterung,<br \/>\n* FROM OPENROWSET(BULK N'C:\\temp\\beschreibung.doc', SINGLE_BLOB) AS datei;<br \/>\nGO<\/code><\/p>\n<p><code> <\/code><\/p>\n<p><code>INSERT INTO dbo.Dokumente(name, erweiterung, datei)<br \/>\nSELECT<br \/>\n'Mein TXT Dokument' AS name,<br \/>\n'txt' AS erweiterung,<br \/>\n* FROM OPENROWSET(BULK N'C:\\temp\\test.txt', SINGLE_BLOB) AS datei<br \/>\nGO<\/code><\/p>\n<p>Nun sind diese 3 Dateien im Filestream Container enthalten.<br \/>\nMit folgender Query kann der Pfad ermittelt werden:<br \/>\n<code>SELECT name, datei.PathName() FROM dbo.Dokumente<\/code><\/p>\n<p>Ergebnis:<br \/>\n<a href=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/select.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-108\" title=\"select\" src=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/select.png\" alt=\"\" width=\"488\" height=\"79\" srcset=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/select.png 488w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/select-300x48.png 300w\" sizes=\"(max-width: 488px) 100vw, 488px\" \/><\/a><\/p>\n<p>Die RTF Datei die eingef\u00fcgt wurde, sieht folgenderma\u00dfen aus:<br \/>\n<a href=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/dokument.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-109\" title=\"dokument\" src=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/dokument.png\" alt=\"\" width=\"500\" height=\"423\" srcset=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/dokument.png 572w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/dokument-300x253.png 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p>Nun ist das n\u00e4chste Ziel, die Datei wiederzufinden indem nach &#8222;Welt&#8220; gesucht wird.<br \/>\nDaf\u00fcr ben\u00f6tigen wir den Volltext Index (Achtung: Dieser muss installiert sein!)<\/p>\n<p>Zuerst wird ein Volltext Katalog ben\u00f6tigt:<br \/>\n<code>CREATE FULLTEXT CATALOG FS_Datei_FT_Katalog AS DEFAULT;<br \/>\nGO<\/code><\/p>\n<p>Nun wird der eigentliche Volltext Index erstellt. Dieser geht \u00fcber die Felder Name, Datei und Erweiterung innerhalb der Tabelle damit diese durchsucht werden k\u00f6nnen. Da das Feld &#8222;datei&#8220; Filestream Daten enth\u00e4lt, wird dieses mit dem Feld Erweiterung als Typ gebunden. So kann der Volltext Index unterscheiden, um was f\u00fcr Daten es sich handelt.<br \/>\n<code>CREATE FULLTEXT INDEX ON [dbo].[Dokumente] KEY INDEX [PK__Dokument__DD7012647F60ED59]<br \/>\nON ([FS_Datei_FT_Katalog]) WITH (CHANGE_TRACKING AUTO)<br \/>\nGO<br \/>\nALTER FULLTEXT INDEX ON [dbo].[Dokumente] ADD ([datei] TYPE COLUMN [erweiterung])<br \/>\nGO<br \/>\nALTER FULLTEXT INDEX ON [dbo].[Dokumente] ADD ([erweiterung])<br \/>\nGO<br \/>\nALTER FULLTEXT INDEX ON [dbo].[Dokumente] ADD ([name])<br \/>\nGO<br \/>\nALTER FULLTEXT INDEX ON [dbo].[Dokumente] ENABLE<br \/>\nGO<\/code><\/p>\n<p>Um zu pr\u00fcfen welche Erweiterungen der Volltext Index unterst\u00fctzt, kann dies mit folgender Abfrage \u00fcberpr\u00fcft werden:<br \/>\n<code>SELECT * FROM sys.fulltext_document_types;<\/code><\/p>\n<p>Weitere Treiber k\u00f6nnen bei Bedarf nachinstalliert werden. Siehe hier (bspw. f\u00fcr Office 2007 oder 2010 Dokumente):<br \/>\n<a href=\"http:\/\/support.microsoft.com\/default.aspx?scid=kb;en-us;945934\">http:\/\/support.microsoft.com\/default.aspx?scid=kb;en-us;945934<\/a><\/p>\n<p>Nun kann der Volltext Index die Dateien durchsuchen:<br \/>\n<code>select name, datei.PathName() from dbo.dokumente where FREETEXT(datei, '\"*welt*\"')<\/code><\/p>\n<p>Ergebnis:<br \/>\n<a href=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/welt.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-110\" title=\"welt\" src=\"http:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/welt.png\" alt=\"\" width=\"481\" height=\"39\" srcset=\"https:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/welt.png 481w, https:\/\/www.flip-design.de\/wp-content\/uploads\/2011\/04\/welt-300x24.png 300w\" sizes=\"(max-width: 481px) 100vw, 481px\" \/><\/a><\/p>\n<p><strong>Weitere Informationen:<\/strong><br \/>\nVolltext Filter: <a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/ms142571.aspx\">http:\/\/technet.microsoft.com\/en-us\/library\/ms142571.aspx<br \/>\n<\/a>Filestream: <a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/bb933993.aspx\">http:\/\/technet.microsoft.com\/en-us\/library\/bb933993.aspx<\/a><\/p>\n<p><em>Das wars.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Artikel geht es um die Speicherung von Dateien und dem Auffinden dieser im SQL Server. Um Dateien nicht komplett in der Datenbank zu speichern, bietet sich Filestream an. Bei dieser Technologie werden lediglich Meta Daten innerhalb der Datenbank &hellip; <a href=\"https:\/\/www.flip-design.de\/?p=106\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[17,10,3,16],"tags":[],"_links":{"self":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/106"}],"collection":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=106"}],"version-history":[{"count":5,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/106\/revisions"}],"predecessor-version":[{"id":115,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=\/wp\/v2\/posts\/106\/revisions\/115"}],"wp:attachment":[{"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.flip-design.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}