Dieser Artikel wurde maschinell übersetzt.

Unter der Tabelle

Programmieren mit FileStreams in SQL Server 2008

Bob Beauchemin

Codedownload von der MSDN-Code-Katalog
Den Code Online durchsuchen

Inhalt

Programmieren von filestreams mit Transact-SQL
Filestreams mit dem Datei-e / a-Programmierung
Der SqlFileStream .NET-Datentyp
FileStreams und Transaktionen
Feature Synergy mit filestreams

Gibt es schon immer viel Diskussion darüber, ob große blobs (binary large objects), wie z. B. Dokument und multimedia-Elemente, sollte in der Datenbank oder im Dateisystem gespeichert werden. Lagerbestand ein, die Datenbank ist eine spezielle Datenrepository, die integrierte integrierte Sichern und Wiederherstellen, Zeitpunkt-Wiederherstellung, Transaktionen, Indizierung, bereitstellt und viel mehr. Andererseits, müssen große Datenmengen in einer Datenbank kann dies Datenbank Fragmentierung sowie die schön Wiederherstellungsfunktionen jedoch auch bedeuten, dass die Daten für große Objekte immer zweimal einmal auf die Datenbank selbst und einmal in das Transaktionsprotokoll geschrieben ist Folge haben. Auch Lesen von große Daten mit SQL bedeutet, dass kostbare Datenbank-Puffer verwenden und leeren der Daten, die andernfalls im Arbeitsspeicher, auf dem Datenträger als ein Nebeneffekt zwischengespeichert werden würde.

Um diese controversy auszugleichen einmal und für alle Microsoft Research hat ein Studie zum Thema und veröffentlicht die Schlussfolgerungen in ein whitepaper " BLOB oder nicht BLOB: große-Objekt-Speicher in einer Datenbank oder einem Dateisystem? " (Siehe research.microsoft.com/apps/pubs/default.aspx?id=64525). Die Schlussfolgerungen wurden ein Rückschlag für Meinung nach "wir alles in einer Datenbank speichern", eine SQL Server 2005-Datenbank für das NTFS-Dateisystem getestet und sollten "BLOBs kleiner als der 256KB von SQL Server, effizienter verarbeitet werden, während NTFS effizienter BLOBS größer als 1 MB ist. Dieser break-even Stelle variiert zwischen anderen Datenbanksystemen, Dateisystemen und Arbeitsauslastungen." Manche Programmierer versucht, das beste aus beiden Welten haben, indem Sie den Speicherort einer NTFS-Datei in eine Datenbankzeile zu speichern, was jedoch diese sacrifices Transaktionen Konsistenz, integrated query und die andere Datenbank-features. In SQL Server 2008 Sie nicht auswählen, eine neue Features, die die filestream-Speicherattribut genannt können Sie Spalten in SQL Server-Tabellen mit einer Spezifikation definieren, dass die Daten tatsächlich im Dateisystem gespeichert werden. Sie können die Daten mit Transact-SQL und Streamingaktivitäten von APIs, die mit C++ und .NET kompatiblen Sprachen Abfragen und behalten alle anderen Datenbank management features. In diesem Artikel werde ich beschreiben, wie Sie dieses hybrid Speicher Modell mit beiden Typen von APIs programmieren würden.

Erstens vielleicht Sie bemerkt haben, dass ich die Funktion wie das filestream-Speicher-Attribut bezeichnet. Die filestream ist keine neuen Datentyp, sondern ein neuer Speichermechanismus. Es ist nur mit varbinary(max) Datentyp in SQL Server 2005 eingeführten erhältlich. Mit filestream muss Speicher der Systemadministrator aktivieren Sie auf ein Betriebssystemebene mithilfe von SQL Server-Konfigurations-Manager und dem Datenbankadministrator in Verbindung aktivieren Sie auf eine SQL Server-Instanz Ebene mithilfe von ' sp_configure '. Dateidatenstrom kann werden deaktiviert, für den lokalen Zugriff aktiviert, oder für lokale und RAS aktiviert. Darüber hinaus muss der DBA-Prozedur eine Datenbank-Dateigruppe definieren, die ein Speicherort NTFS-Dateisystem zu einer SQL Server-Datenbank gebunden. Beachten Sie, dass die Dateigruppe auf einen Speicherort im lokalen Dateisystem muss; filestreams kann nicht auf einem remote server oder ein Netzwerk adressierbaren (NAS) Speichergeräte live, sofern das NAS-Gerät als lokalen NFS volume über iSCSI-angezeigt wird. Beim Zugriff auf die filestream-verwendet der server message block (SMB) Protokoll, wenn Sie damit E/A-Formatvorlage Dateizugriff von außerhalb des Computers, auf dem SQL Server installiert, Sie Zugriff auf den SMB-port ermöglichen, die müssen (normalerweise port 445, Port 139 als fallback) über die firewall. Sobald die administrativen Komponenten vorhanden sind, wird Sie ein (maximal) varbinary-Spalten einfach als Teil einer Tabellendefinition mit der FileStream-Eigenschaft definieren, und die Daten für diese Spalte werden automatisch in Dateien gespeichert. Darüber hinaus muss jede Tabelle, die eine FILESTREAM-Spalte verwendet eine Spalte, die mit den UNIQUEIDENTIFIER-Datentyp, der die ROWGUIDCOL-Eigenschaft hat definiert. Eine version der Northwind-Datenbank-Personal-Tabelle, filestreams zu verwendet, sieht wie Abbildung 1 aus.

Abbildung 1 Personal-Tabelle mit filestreams

CREATE TABLE [dbo].[Employees2](
  [EmployeeID] [int] IDENTITY NOT NULL PRIMARY KEY,
  [LastName] [nvarchar](20) NOT NULL,
  [FirstName] [nvarchar](10) NOT NULL,
  [Title] [nvarchar](30) NULL,
  -- filestream storage for photo column
  [Photo] [varbinary](max) FILESTREAM NULL,
  [ReportsTo] [int] NULL,
  -- identifier column
  [RowGuid] [UNIQUEIDENTIFIER]  NOT NULL  
        ROWGUIDCOL UNIQUE DEFAULT NEWID()
);

Dateidatenstrom verwendet das Protokoll herkömmlichen Datenbank und einer bestimmten Protokollierungsmechanismus als Erweiterung des herkömmlichen Transaktionsprotokoll, in dem Änderungen an der Datei aufgezeichnet. Die Erweiterung ist unabhängig von der normalen SQL-Server Datenbank-Transaktion melden Sie sich mit der Sicherung jedoch integrierte und Dienstprogramme wiederherstellen. Weitere Informationen zu filestream aus einer administrativen und Datenbank-Interna der Sicht finden Sie in Paul Randal des hervorragende whitepaper Dateidatenstrom von Remotespeicher in SQL Server 2008 am msdn.microsoft.com/library/cc949109.

Möchten Typ aus einer SQL Server-Programmierer Fehlerquelle anzeigen, das filestream-Objekt fast genau wie die Daten varbinary (Maximum) Verhalten kann mit ein paar Vorsichtsmaßnahmen. Transact-SQL können Sie die Daten abgefragt, ohne Anwendungsprogramme überhaupt. Keine Änderungen an der Tabelle Employees2 zu angezeigt, die ich weiter oben in einem DataGrid-Steuerelement definiert Sie benötigen die einfache Windows Forms-Anwendung in den code für diesen Artikel enthalten. Jedoch dann kommt der Wert im Hinblick auf die Leistung hinzugefügt, wenn die filestream-spezifische-API-Erweiterungen zum Lesen und schreiben die Daten über Streambasierte APIs. Eine weitere gewinnen ist, dass die maximale Größe der Daten in einer bestimmten Spalte nicht mehr für die filestream-basierte varbinary(max)-Spalte auf 2 GB beschränkt. Die maximale Größe dieser bestimmten Spalten ist unbegrenzt. Das bedeutet, dass Sie, z. B. 7GB medizinischen Bilder, wie X-Ray Bilder in einer Spalte in einer normalen SQL Server-Tabelle speichern können. Dateidatenstrom-Daten werden nicht auf die maximale Größenbeschränkung von 4 GB in einer SQL Server Express Edition-Datenbank, gezählt, sodass Sie auch mit blobs in SQL Server 2008 Express Edition verwendet werden kann.

Bevor ich in die APIs wechseln, möchte ich, Belastungstests, sobald Sie Datei Daten verwenden von SQL Server-filestream-Speicher, Sie müssen nicht zugreifen oder Ändern der Daten außerhalb des SQL Server-Steuerelements gespeichert haben. Die Verzeichnisse, in dem der filestream-Dateien Live, werden durch (discretionary access control list) geschützt, die nur die Windows-Gruppe Zugriff ermöglicht, die das SQL Server-Dienstkonto und das system-Administratorkonto enthält. Und der Systemadministrator kann Ihr Zugriff durch Ändern der DACL entfernen. Wenn ein Benutzer versucht, eine Datei mithilfe der streaming-APIs zu öffnen, wird eine Zugriffsüberprüfung für die herkömmlichen SQL-Berechtigungen in der Datenbank, schema, Tabelle durchgeführt wird, und Spalte und die NTFS-Berechtigungen sind ignoriert. Bearbeiten von der filestream-Daten direkt mithilfe von „ notepad.exe (oder mehr wahrscheinlich ein spezielle Foto-editor-Programm) führt in der Regel eine beschädigte Datenbank. Jedoch können mithilfe der Transaktionen streaming-APIs, die SQL Server bietet an, Sie Ihr eigenes Programm für die SQL Server-basierten "Transaktions-Editor" schreiben.

Programmieren von filestreams mit Transact-SQL

Obwohl filestreams mit Programmieren T-SQL ist genauso wie normale T-SQL-Programmierung, ein paar Vorsichtsmaßnahmen. Ersten, teilweise Aktualisierungen der filestream-Spalte mit der varbinary(max) WRITE-Methode nicht zulässig sind. Darüber hinaus die streaming-APIs auf einen Pfad-Dateinamen vom SQL Server erforderlich (d. h. die streaming-APIs Es können nur verwendet werden wenn der Wert der filestream-Spalte ungleich NULL ist),, T-SQL ist die einzige Möglichkeit um den Dateinamen zu erhalten. Obwohl einfügen von einen NULL-Wert in einer filestream-Spalte eine Datei nicht erstellen werden, einen Wert ungleich NULL einfügen eine Datei erstellt werden verursacht. Ein UPDATE auf eine filestream-Spalte verursacht die alte Datei gelöscht werden und eine neue-Datei in ursprünglichen Speicherort erstellt werden. Einem DELETE-Vorgang auf einer Zeile führt die entsprechende Datei gelöscht werden. Beachten Sie, dass die Datei mit einer UPDATE- oder DELETE-Vorgang gelöscht nicht aus dem Dateisystem sofort ausgeblendet werden; ein garbage collector-thread wird verwendet werden, physisch löschen die Datei und den Speicherplatz freigegeben.

Alle der T-SQL-integrierten Funktionen der Arbeit mit varbinary(max) Arbeit mit einer filestream-Spalte, z. B. SUBSTRING, ersetzen, Länge und CHARINDEX. Dateidatenstrom-Speicher ist nur für Spalten in Datenbanktabellen zulässig; Variablen, Parameter (einschließlich Tabellenwertfunktionen Parameter), Spalten in temporäre Tabelle Strukturen und Rückgabewerte der Tabellenfunktion kann nicht das FileStream-Attribut. Darüber hinaus Beachten Sie, dass das FileStream-Attribut verfügbar ist nur für varbinary(max) Spalten; wie andere große Datentypen 'varchar(max)', und XML-dürfen nicht das filestream-Attribut angeben. Wenn Sie die Zeichen oder XML-Daten im filestream-Speicher zu speichern möchten, müssen Sie Geben Sie die Spalte als varbinary(max) und Verwenden von CAST oder CONVERT um die Daten als Zeichen oder XML-verarbeiten.

Um auf die filestream-Daten mithilfe der streaming-APIs zuzugreifen, müssen Sie zuerst T-SQL erhalten Sie einen Pfadnamen verwenden; dies geschieht mit der (Groß-/ Kleinschreibung beachten) PathName()-Methode für die filestream-Spalte. Der Dateidatenstrom logische Pfade sind mit Versionsnummern versehen und im version 1 format, das von SQL Server 2008 verwendet wird, der Pfadname an gebunden (aber nicht gleich) den Wert der ROWGUIDCOL-Spalte in der gleichen Zeile. Obwohl Sie filestream-Spalten in abgeleiteten Tabellen und Ansichten verwenden können, achten Sie darauf, die ROWGUIDCOL um beibehalten, Fall, dass Sie die PathName()-Methode verwenden müssen. Z. B. für Tabelle T, die eine filestream und eine rowguid-Spalte enthält, schreiben Sie den code in Abbildung 2 fest.

Abbildung 2 erstellen eine Ansicht

CREATE VIEW View1 
AS
SELECT RowGuidColumn , FileStreamColumn
FROM T;

SELECT FileStreamColumn.PathName() FROM View1;  -- works
GO

CREATE VIEW View2 
AS
SELECT FileStreamColumn FROM T;
GO

-- Fails because it is missing the RowGuidColumn
SELECT FileStreamColumn.PathName() FROM View2;
GO

Schließlich wird die Datenverschlüsselung für filestream-Spalten nicht unterstützt. Dies gilt nicht nur für die Datenverschlüsselung APIs wie EncryptByKey, sondern auch für die SQL Server 2008 transparent Daten Verschlüsselung-Funktion. Obwohl Datenbanken mit filestream-Speicher transparent die Datenverschlüsselung angeben können, werden die filestream-Dateien nicht verschlüsselt.

Filestreams mit dem Datei-e / a-Programmierung

Bevor Sie mit streaming-e / a-mit der filestream-Speicher-Spalte, gibt es einige Anforderungen auf der Clientseite. Sie müssen eine integrierte Sicherheit von-Konto verwenden, wenn mit e / a-streaming, da es ist keine Möglichkeit, die SQL-Anmeldeinformationen übergeben werden, wenn öffnen den handle.Because filestream-Speicher mit der eine spezielle filter Dateisystemtreiber, Programmieren mit einer Spalte, die filestream-Speicher verwendet implementiert wurde mit der ein Dateihandle betrifft, die alle Win32-Vorgänge nicht unterstützt. Die nativeWin32-Funktion an, die das Dateihandle abruft ist OpenSqlFilestream. Diese Funktion ist Teil der SQL Native Client 10 DLL, der auch der SQL Server-ODBC-Treiber, die OLE DB-Anbieter und die Netzwerkbibliotheken enthält. Die Funktion gibt ein Win32-handle, das meisten Funktionen des ein Win32-Dateihandle streaming unterstützt. Während eine Pfad- und einige zusätzlichen Optionen erhalten eine Win32-Dateizugriffsnummer benötigt werden, erfordert die Funktion OpenSqlFilestream zwei Stück von Informationen, die nur von SQL Server bereitgestellt werden können. Dies sind die Namen der Datei von Aufrufen der PathName()-Methode in der Spalte, die filestream-Speicher und ein token Transaktion verwendet zurückgegeben. Dies bedeutet, wenn Sie mit der OpenSqlFilestream programmieren, Sie die INSERT, UPDATE oder SELECT-Anweisung in die Entsprechung von zwei "SQL" Anweisungen, die T-SQL-Anweisung und die streaming-Anweisung aufgeteilt sind. Diese Anweisungen müssen zusammen mit einer Transaktion gebunden werden. Obwohl ich mehr über die Buchung und die unterstützte Isolierungsebenen später für den Moment erwähnen müssen ist es ausreichend zu wissen, dass Sie eine T-SQL-Funktion, GET_FILESTREAM_TRANSACTION_CONTEXT(), um das token für die Buchung zu erhalten aufrufen müssen. Dieses token muss im Kontext des gleichen windows-Benutzer, wie das Öffnen der Datei abgerufen werden. Beachten Sie, dass die ursprüngliche SQL-Anweisung, um das token für die Buchung zu erhalten muss Teil einer Transaktion sein, andernfalls das token Transaktion NULL sein wird und OpenSqlFilestream schlägt fehl. Sie können nicht die Transaktion bis das HANDLE geschlossen wird. Das Dateihandle APIs, die unterstützt werden mit den speziellen Dateihandle werden ReadFile, WriteFile, TransmitFile, SetFilePointer, SetEndOfFile oder FlushFileBuffers sind. Versuch, eine andere Datei-API-aufrufen, gibt ERROR_ACCESS_DENIED. Speicherbilddateien werden mit der speziellen HANDLE insbesondere nicht unterstützt.

Ein vollständiges Beispiel Verwenden ODBC- und C++ zum Einfügen von einer neuen Zeile und filestream Daten, die mithilfe von OpenSqlFilestream ist in der SQL Server 2008-Onlinedokumentation enthalten.

Mit einer SELECT-Anweisung werden Sie müssen stellen nur einen einzigen Roundtrip der Datenbank für Ihre Pfadnamen und Buchung token; mit einer INSERT- oder UPDATE-Anweisung, Sie damit auch nur eine Datenbank Roundtrip. Diese Anweisungen Lieferumfang die T-SQL-OUTPUT-Klausel, in SQL Server 2005 eingeführten zu Ihrer Hilfe. Hier ist eine UPDATE-Anweisung, die eine einzelne Zeile verarbeitet und aller in einem Roundtrip gewünschten Informationen abgerufen:

UPDATE dbo.Employees2 
SET name = 'NewName' WHERE id = 8
OUTPUT inserted.photo.PathName(),
       GET_FILESTREAM_TRANSACTION_CONTEXT()

Noch nicht erwähnt mithilfe von der DELETE-Anweisung, da das Löschen einer Zeile auch die Datei löschen werden; Sie können nicht verwenden streaming-e / a-um eine DELETE auszuführen. Es gibt jedoch einige Dinge, die müssen Sie wissen, wenn INSERT- oder UPDATE zum Lesen und Schreiben das blob. Darüber hinaus werde ich das blob-update unterteilen Sie in zwei Anwendungsfällen: Füllen ersetzt (zum erneuten Schreiben von Adressen) und partielle aktualisieren.

Eine Zeile, die mit der INSERT-blob enthält einfügen gehört zu der am besten Gründe für die mit streaming-e / a. SQL Server-APIs nicht streaming Eingaben, die Verwendung einer Spalte varbinary(max) nicht unterstützt, obwohl Sie die Daten in Blöcken schreiben können, mithilfe der T-SQL-Inhalte-Funktion oder der WRITE-Methode. (Beachten Sie, dass die WRITE-Methode bei Verwendung der filestream-Speicher verboten wird.) Die interessante allerdings mit INSERT ist, dass einen NULL-Wert einfügen keine Datei erstellt. Die PathName()-Methode wird ebenfalls NULL zurück und Sie möchten keine Datei für streaming der Daten. Die eine INSERT-Ansatz besteht fügen eine leere Zeichenfolge anstatt auf einen NULL-Wert ein, Abrufen des Pfadnamens und Ausstrahlen von Inhalt in die leere Datei. Die T-SQL-Anweisung würde folgendermaßen aussehen:

INSERT dbo.Employees2 (id, ... photo)
VALUES(1, ... CAST('' as VARBINARY(MAX))
OUTPUT inserted.photo.PathName(),GET_FILESTREAM_TRANSACTION_CONTEXT()

Sie können dann die Datei für schreiben und Datenstrom in den Daten öffnen. Einen vollständigen Ersatz würde UPDATE wie einer INSERT funktionieren. Sie möchten die nicht-filestream-Spalten aktualisieren, der Pfad und Buchung token und stream-Daten in über das Dateihandle. Sei denn, Sie kennen die filestream-Speicher-Spalte enthält bereits Daten, eine sollten So aktualisieren Sie die Daten auf eine leere Zeichenfolge in der T-SQL-Anweisung.

Ein partielles update einer filestream-Spalte ist ein wenig komplizierter, da Sie die Informationen in der Datei zuvor eine Aktualisierung lesen möchten. Um dies zu erreichen, können Sie die Funktion „ DeviceIoControl mit den Ziehpunkt, und der FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT-parameter verwenden. Dadurch wird eine serverseitige Kopie der Inhalt der Datei. Nach dem Ausführen dieser Aufruf, wird ReadFile die entsprechenden Daten vor dem Aufruf zurückgegeben, ReadFile Ende der Datei zurückgegeben wird. Wenn Sie Lesen und Aktualisieren auf diese Weise, empfiehlt es zum überlappende e / a-hohe Leistung-Anwendungen und insbesondere solche, die demselben Computer wie SQL Server filestream zugreifen kann. Tragen Sie berücksichtigen, müssen Sie viel teilweise Aktualisierungen, mit der filestream-Speicher erheblich langsamer als mit SQL Server-varbinary(max) ohne filestream-Speicher ist.

Der SqlFileStream .NET-Datentyp

.NET Programmierer möchten in der Regel Win32-Dateikennungen behandeln. Obwohl es möglich, OpenSqlFilestream zu verwenden, in .NET-Programmen mithilfe eines Verfahrens PInvoke (Plattform code aufrufen) bezeichnet, wäre es mehr bequem, damit die OpenSqlFilestream-Funktion und die Datei zugreifen, die in der .NET-Klasse eingekapselt verarbeiten wäre. In .NET Framework 3.5 SP1 füllt die Klasse System.Data.Types.SqlFileStream problemlos die Stückliste. Die Verwendung ist hauptsächlich das gleiche; die SqlFileStream des Konstruktors erfordert, ein Pfadname und ein token für die Transaktion, sowie einige Optionen. Mit der eine Zeile INSERT SqlFileStream ist im Codedownload dargestellt, die dieser Rubrik begleitet.

Das SqlFileStream-Objekt wird von System.IO.Stream abgeleitet., und Sie verwenden es wie Sie einen "normalen" .NET Stream verwenden möchten. Einige wichtige Unterschiede zwischen die Verwendung der SqlFileStream-API und die OpenSqlFilestream Win32-Funktion, SqlFileStream eine Standard-Puffergröße von 4K verwendet, nicht des OpenSqlFilestream-handle. Darüber hinaus mit SqlFileStream für ReadWrite-Modus wird automatisch ausführen die DeviceIoControl Aufrufe einfacherer; die systemeigene API unterstützt keine dies und "partielles Update" Muster werden beteiligte explizite DeviceIoCtrl aufrufen. Damit den SqlFileStream-Datentyp verwenden können, müssen Sie .NET 3.5 SP1 sein muss auf dem client oder web-server installiert sein.

FileStreams und Transaktionen

Wie bereits erwähnt, ist eine der der Sehenswürdigkeiten der Verwendung von filestream-Speicher statt einfach Dateinamen in SQL Server und Dateien auf dem Dateisystem speichern fest, dass die Daten über konsistent ist. Wenn Sie eine Zeile in Transact-SQL einfügen und Einfügen einer Datei mithilfe der streaming-APIs, der gesamte Vorgang entweder erfolgreich ist oder fehlschlägt. Besteht keine Möglichkeit der Dateinamen der Dateien, die nicht vorhanden sind oder verwaiste Datei-system-Elemente, die nicht über einen entsprechenden Eintrag in SQL Server verfügen. Die OpenSqlFilestream-API gewährleistet dies, indem Sie eine gültige, offene Transaktion bei ständig haben, wenn die streaming-APIs verwenden. Aber SQL Server unterstützt eine Vielzahl von Buchungsebenen für die Isolierung und zwei anderen Transaktion-Semantik: Sperren und Versionsverwaltung. Funktioniert wie die streaming-APIs mit allen der Isolierungsebenen angegeben, dass system Dateisperren nicht von SQL Server-Sperren-manager verwaltet wird?

Bei der Verwendung streaming ist es hilfreich, die den atomaren Vorgang als besteht vorstellen von zwei verschiedene SQL-Anweisungen--eine für der T-SQL-Bereich und einer zweiten Anweisung für den streaming Teil. Um das token für die Buchung zu erhalten, müssen Sie zuerst Ausführen von der T-SQL-Bereich. Vor dem Ausführen der T-SQL-Befehls müssen Sie eine explizite Transaktion beginnen, indem die ADO.NET-SqlConnection.BeginTransaction--Methode oder " System.Transactions "' TransactionScope; Analog Methoden für das manuelle und automatische Transaktionsverwaltung auf andere APIs wie ODBC-angezeigt werden. Die Buchung muss geöffnet gehalten werden bis das Dateihandle geschlossen wird. Registrieren einen SqlTransaction.Save-Aufruf ist unzulässig, während das Dateihandle geöffnet ist, und die Transaktion uncommittable macht. Ein SqlTransaction.Rollback-Aufruf ausgegeben wird der Transaktion Rollback auch wird die Datei geöffnet. Trigger ausgelöst, wenn das Dateihandle geschlossen wird.

Mithilfe der streaming-APIs und eine filestream-Speicher wird durch alle vier Sperren isolation Buchungsebenen, gestattet Obwohl die Semantik von Streamingaudio Zugriff immer ähnlich zugesichert zu lesen ist. Mit von schreibgeschützten zugesichert-Isolationsgrad (Standard), wird die Datei für Lesen, andere Leser lesen Sie die Datei geöffnet wird – Schreiber gesperrt werden. Wenn die Datei zum Lesen geöffnet wird, bleibt es bis zum Ende der Transaktion blockierte. Read-nicht abgeschlossenen Isolationsstufe ist mit dem Nachteil zulässig, wenn ein update der Datei ausgeführt wird, die Transaktion schreibgeschützt nicht abgeschlossenen die alte version der Datei, sondern die neue version vorgeschlagenen lesen wird wie das übliche Lesezugriff nicht abgeschlossenen Verhalten. Wiederholbarer Lesevorgang und serialisierbar Verhalten entspricht dem Verwendung Dateistreaming, als wenn Zeilen in der Datenbank gesperrt werden.

Versionsverwaltung Isolierungsebenen – d. h. zugesichert schreibgeschützten snapshot-isolation und Snapshottransaktionen, dürfen nicht in einer Datenbank, die filestreams verwendet. Dies gilt für die gesamte Datenbank, nicht nur die Tabelle mit eine filestream-Spalte. Die ALTER DATABASE-Anweisung, die Lesezugriff zugesichert ermöglicht snapshot isolation und, dass die ermöglicht Snapshottransaktionen bei vorliegen von filestream-Speicher fehl werden.

Feature Synergy mit filestreams

Dateidatenstrom eignet sich zum Speichern Sie umfangreiche Daten in einer Datenbank, ohne dass der Aufwand für das Transaktionsprotokoll und Datenbank Fragmentierung Verhalten jedoch gelegentlich ist sinnvoll, einen Teil der Daten an eine permanente berechnete Spalte hoist. Dies dient zum Abfragen von Eigenschaften des das-blob führen, ohne zu lesen die Datei überhaupt. Sagen Sie z. B., dass Sie Fotos in JPEG-format Speichern wurden und Teile der Farbe-Tabelle, z. B. Hintergrundfarbe oder Foto Höhe und Breite separat speichern möchten. Sie können einfach definieren eine permanente berechnete Spalte für diesen Teil der Spalte varbinary(max); die Daten gespeicherte in Zeile. Ein Beispiel, Employees2 in der Tabelle oben definierte würde folgendermaßen aussehen:

ALTER TABLE dbo.Employees2
  ADD PhotoWidth AS dbo.ExtractWidth(Photo) PERSISTED;
A SQL query to obtain the photo width does not need to access the file at all:
SELECT Id, Photo 
FROM dbo.Employees2
WHERE PhotoWidth > 1200;

Beachten Sie, jedoch, dass Indizes für permanente berechnete Spalten vom Typ varbinary nicht zulässig sind.

Ein hervorragendes Beispiel feature Synergie ist die Kombination von SQL Server Volltext Indizes und Volltext-suchen mit filestream-Speicher. Vorhandenen Suche filter Komponenten vorhanden sein, für Dokumenttypen, wie Microsoft Office-Dokumente, PDF-Dateien usw., Textdateien aus, und filestream-Speicher kann diese Dateien im Dateisystem statt in der Datenbank gespeichert werden. Sie können Kopien Fehlerprotokolle oder Web-Protokolldateien in eine filestream-Speicher-Spalte speichern, und Volltext die Spalte indizieren, als ein konkretes Beispiel. Wird in SQL Server 2008 Volltext-Suche in-Prozess ausgeführt, es nicht notwendig, out-of-process-Aufrufe an den Suchdienst ist. Eine Abfrage, wie unter kann funktioniert in den Prozess und sehr schnell:

SELECT id, Abstract 
FROM error_logs 
WHERE CONTAINS(ErrorText, 'unhandled');

Beginn der in diesem Artikel von filestream vorschlagen Speicher zur Verfügung gestellt nicht nur integrierte Sicherung, Wiederherstellung und Transaktionen Konsistenz zwischen SQL-Daten und Dateidaten, zwar filestream-Speicher nur lokalen Speicherplatz verwenden kann. Wenn Sie, nur mit Transaktionen Konsistenz befürchten und die Dateien auf einen Remoteserver oder die content-adressierbaren Speicher befinden soll dabei, umfasst SQL Server 2008 ein Begleit-Features, die dem BLOB-Speicher (RSP). Dieses feature ist verfügbar als kostenloser download als Teil der SQL Server 2008 Feature Pack. RSP-Code besteht aus einer API, die die Buchung bearbeiten und einer Reihe von gespeicherten Prozeduren zum Verarbeiten von blob-Zeiger in Datenbanktabellen, blob garbage collection und Buchung Teilnahme ermöglicht. Content-adressierbaren Speicher-Hersteller bieten Treiber für die bestimmte hardware. Ein Beispiel-RSP-Code-Treiber für das NTFS-Dateisystem ist verfügbar, als download auf CodePlex und EMC eine Betaversion RSP-Code-Anbieter für Ihre Centera content-adressiert Speichersystem Version wurde. Die API RSP-Code ähnelt nicht die filestream-API-, jedoch diese APIs kann in Zukunft ausgerichtet werden.

In conclusion ermöglicht filestream-Speicherung Ihnen zum Speichern von großen blobs als Dateien im Dateisystem und zum darauf mit T-SQL-Anweisungen oder Transaktionsnachrichten streaming-APIs zugreifen. Mit diesem feature können Sie die Leistung sowie der vollständigen Datenbank-integration für große blobs streaming erhalten.

Senden Sie Fragen und die Kommentare für Paul zummdbdev@Microsoft.com

Bob Beauchemin ist ein-zentrierten Datenbankanwendung practitioner und Architekten, Kurs Autor und Kursleiter, writer und Entwickler wissen Partner an SQLskills. Er ist Bücher und Artikel auf SQL Server, Datenzugriff Integrationstechnologien und Datenbanksicherheit für die geschrieben. Sie erreichen ihn anbobb@SQLSkills.com.