Condividi tramite


FILESTREAM (SQL Server)

FILESTREAM consente alle applicazioni basate su SQL Server di archiviare dati non strutturati, ad esempio documenti e immagini, nel file system. Le applicazioni possono sfruttare le API di streaming avanzate e le prestazioni del file system e allo stesso tempo mantenere la coerenza transazionale tra i dati non strutturati e i dati strutturati corrispondenti.

FILESTREAM integra il motore di database di SQL Server con un file system NTFS archiviando varbinary(max) i dati BLOB (Binary Large Object) come file nel file system. Le istruzioni Transact-SQL possono inserire, aggiornare, interrogare, cercare ed effettuare il backup dei dati FILESTREAM. Le interfacce del file system Win32 forniscono l'accesso in streaming ai dati.

FILESTREAM usa la cache di sistema NT per memorizzare nella cache i dati dei file. Ciò consente di ridurre qualsiasi effetto che i dati FILESTREAM potrebbero avere sulle prestazioni del motore di database. Il pool di buffer di SQL Server non viene usato; pertanto, questa memoria è disponibile per l'elaborazione delle query.

FILESTREAM non viene abilitato automaticamente durante l'installazione o l'aggiornamento di SQL Server. È necessario abilitare FILESTREAM usando Gestione configurazione SQL Server e SQL Server Management Studio. Per usare FILESTREAM, è necessario creare o modificare un database per contenere un tipo speciale di filegroup. Creare o modificare quindi una tabella in modo che contenga una varbinary(max) colonna con l'attributo FILESTREAM. Dopo aver completato queste attività, puoi usare Transact-SQL e Win32 per gestire i dati FILESTREAM.

Per altre informazioni sull'installazione e l'uso di FILESTREAM, vedere l'elenco di attività correlate.

Quando usare FILESTREAM

In SQL Server i BLOB possono essere dati standard varbinary(max) che archivia i dati in tabelle o oggetti FILESTREAM varbinary(max) che archivia i dati nel file system. Le dimensioni e l'uso dei dati determinano se è necessario usare l'archiviazione del database o l'archiviazione del file system. Se le condizioni seguenti sono vere, è consigliabile usare FILESTREAM:

  • Gli oggetti archiviati sono, in media, maggiori di 1 MB.

  • L'accesso in lettura veloce è importante.

  • Si sviluppano applicazioni che usano un livello intermedio per la logica dell'applicazione.

Per oggetti più piccoli, l'archiviazione varbinary(max) di BLOB nel database offre spesso prestazioni di streaming migliori.

Archiviazione FILESTREAM

L'archiviazione FILESTREAM viene implementata come colonna varbinary(max), in cui i dati vengono archiviati come BLOB nel file system. Le dimensioni dei BLOB sono limitate solo dalle dimensioni del volume del file system. La limitazione standard varbinary(max) delle dimensioni dei file da 2 GB non si applica ai BLOB archiviati nel file system.

Per specificare che una colonna deve archiviare i dati nel file system, specificare l'attributo FILESTREAM in una varbinary(max) colonna. In questo modo il motore di database archivia tutti i dati per tale colonna nel file system, ma non nel file di database.

I dati FILESTREAM devono essere archiviati nei filegroup FILESTREAM. Un filegroup FILESTREAM è un filegroup speciale che contiene directory del file system anziché i file stessi. Queste directory del file system sono denominate contenitori di dati. I contenitori di dati sono l'interfaccia tra l'archiviazione del motore di database e l'archiviazione del file system.

Quando si usa l'archiviazione FILESTREAM, tenere presente quanto segue:

  • Quando una tabella contiene una colonna FILESTREAM, ogni riga deve avere un ID di riga univoco non null.

  • È possibile aggiungere più contenitori di dati a un filegroup FILESTREAM.

  • I contenitori di dati FILESTREAM non possono essere annidati.

  • Quando si usa il clustering di failover, i filegroup FILESTREAM devono trovarsi nelle risorse del disco condiviso.

  • I filegroup FILESTREAM possono trovarsi in volumi compressi.

Gestione integrata

Poiché FILESTREAM viene implementato come varbinary(max) colonna e integrato direttamente nel motore di database, la maggior parte degli strumenti e delle funzioni di gestione di SQL Server funziona senza modifiche per i dati FILESTREAM. Ad esempio, è possibile usare tutti i modelli di backup e ripristino con dati FILESTREAM e i dati FILESTREAM vengono sottoposti a backup con i dati strutturati nel database. Se non si desidera eseguire il backup dei dati FILESTREAM con i dati relazionali, è possibile utilizzare un backup parziale per escludere i filegroup FILESTREAM.

Sicurezza integrata

In SQL Server i dati FILESTREAM vengono protetti esattamente come altri dati: concedendo autorizzazioni a livello di tabella o colonna. Se un utente dispone dell'autorizzazione per la colonna FILESTREAM in una tabella, l'utente può aprire i file associati.

Annotazioni

La crittografia non è supportata nei dati FILESTREAM.

Solo l'account al quale viene eseguito il servizio SQL Server ha le autorizzazioni NTFS per il contenitore FILESTREAM. È consigliabile non concedere altre autorizzazioni per il contenitore di dati.

Annotazioni

Gli account di accesso SQL non funzioneranno con i contenitori FILESTREAM. Solo l'autenticazione NTFS funzionerà con i contenitori FILESTREAM.

Accesso ai dati BLOB con Transact-SQL e accesso in streaming al file system

Dopo aver archiviato i dati in una colonna FILESTREAM, è possibile accedere ai file usando le transazioni Transact-SQL o le API Win32.

Transact-SQL accesso

Usando Transact-SQL, è possibile inserire, aggiornare ed eliminare dati FILESTREAM:

  • È possibile usare un'operazione di inserimento per prepopopolare un campo FILESTREAM con un valore Null, un valore vuoto o dati inline relativamente brevi. Tuttavia, una grande quantità di dati viene trasmessa in modo più efficiente in un file che usa interfacce Win32.

  • Quando si aggiorna un campo FILESTREAM, si modificano i dati BLOB sottostanti nel file system. Quando un campo FILESTREAM viene impostato su NULL, i dati BLOB associati al campo vengono eliminati. Non è possibile usare un aggiornamento in blocchi Transact-SQL, implementato come UPDATE**.**Write() per eseguire aggiornamenti parziali ai dati.

  • Quando si elimina una riga o si elimina o si tronca una tabella contenente dati FILESTREAM, eliminare i dati BLOB sottostanti nel file system.

Accesso in streaming al file system

Il supporto per lo streaming Win32 funziona nel contesto di una transazione di SQL Server. All'interno di una transazione, è possibile usare le funzioni FILESTREAM per ottenere un percorso logico del file system UNC di un file. Usare quindi l'API OpenSqlFilestream per ottenere un handle di file. Questo handle può quindi essere usato dalle interfacce di streaming di file Win32, ad esempio ReadFile() e WriteFile(), per accedere e aggiornare il file tramite il file system.

Poiché le operazioni sui file sono transazionali, non è possibile eliminare o rinominare file FILESTREAM tramite il file system.

Modello di rendiconto

L'accesso al file system FILESTREAM simula una dichiarazione Transact-SQL tramite l'apertura e chiusura di file. L'istruzione inizia quando viene aperto un handle di file e termina quando l'handle viene chiuso. Ad esempio, quando un handle di scrittura viene chiuso, qualsiasi possibile trigger AFTER registrato nella tabella viene attivato come se un'istruzione UPDATE sia completata.

Namespace di archiviazione

In FILESTREAM il motore di database controlla lo spazio dei nomi del file system fisico BLOB. Una nuova funzione intrinseca , PathName, fornisce il percorso UNC logico del BLOB che corrisponde a ogni cella FILESTREAM della tabella. L'applicazione usa questo percorso logico per ottenere l'handle Win32 e operare sui dati BLOB usando le normali interfacce del file system Win32. La funzione restituisce NULL se il valore della colonna FILESTREAM è NULL.

Accesso al file system transazionato

Una nuova funzione intrinseca, GET_FILESTREAM_TRANSACTION_CONTEXT(), fornisce il token che rappresenta la transazione corrente a cui è associata la sessione. La transazione deve essere stata avviata e non ancora interrotta o completata. Ottenendo un token, l'applicazione associa le operazioni di streaming del file system FILESTREAM a una transazione avviata. La funzione restituisce NULL in caso di nessuna transazione avviata in modo esplicito.

È necessario chiudere tutti gli handle di file prima della conferma o dell'interruzione della transazione. Se un handle viene lasciato aperto oltre l'ambito della transazione, ulteriori letture sull'handle causeranno un errore; scritture aggiuntive sull'handle avranno esito positivo, ma i dati effettivi non verranno scritti su disco. Analogamente, se il database o l'istanza del Database Engine viene spento, tutti gli handle aperti vengono invalidati.

Durabilità transazionale

Con FILESTREAM, al momento del commit della transazione, il motore di database garantisce la durabilità delle transazioni per i dati BLOB FILESTREAM modificati tramite accesso in streaming dal file system.

Semantica di isolamento

La semantica di isolamento è governata dai livelli di isolamento delle transazioni del motore di database. Il livello di isolamento read-committed è supportato per Transact-SQL e per l'accesso al file system. Sono supportate le operazioni di lettura ripetibili, nonché gli isolamenti serializzabili e snapshot. La lettura sporca non è supportata.

Le operazioni di apertura dell'accesso al file system non attendono alcun blocco. Le operazioni aperte hanno invece esito negativo immediatamente se non riescono ad accedere ai dati a causa dell'isolamento delle transazioni. Le chiamate API di streaming hanno esito negativo con ERROR_SHARING_VIOLATION se l'operazione di apertura non può continuare a causa di una violazione dell'isolamento.

Per consentire l'esecuzione di aggiornamenti parziali, l'applicazione può rilasciare un controllo FS del dispositivo (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) per recuperare il contenuto precedente nel file a cui fa riferimento l'handle aperto. Verrà generata una copia del contenuto precedente dal lato server. Per migliorare le prestazioni dell'applicazione ed evitare potenziali timeout quando si usano file di grandi dimensioni, è consigliabile usare l'I/O asincrona.

Se viene emesso il FSCTL dopo la scrittura dell'handle, l'ultima operazione di scrittura verrà mantenuta e le scritture precedenti effettuate all'handle andranno perse.

API del file system e livelli di isolamento supportati

Quando un'API del file system non può aprire un file a causa di una violazione dell'isolamento, viene restituita un'eccezione ERROR_SHARING_VIOLATION. Questa violazione di isolamento si verifica quando due transazioni tentano di accedere allo stesso file. Il risultato dell'operazione di accesso dipende dalla modalità in cui il file è stato aperto e dalla versione di SQL Server in cui è in esecuzione la transazione. Nella tabella seguente vengono descritti i risultati possibili per due transazioni che accedono allo stesso file.

Transazione 1 Transazione 2 Risultato in SQL Server 2008 Risultato in SQL Server 2008 R2 e versioni successive
Aprire per la lettura. Apri per leggere. Entrambi hanno esito positivo. Entrambi hanno esito positivo.
Apri per la lettura. Apri per scrivere. Entrambi hanno esito positivo. Le operazioni di scrittura nella transazione 2 non influiscono sulle operazioni di lettura eseguite nella transazione 1. Entrambi hanno esito positivo. Le operazioni di scrittura nella transazione 2 non influiscono sulle operazioni di lettura eseguite nella transazione 1.
Apri per scrivere. Apri per la lettura. L'apertura della transazione 2 fallisce con un'eccezione ERROR_SHARING_VIOLATION. Entrambi hanno esito positivo.
Apri per scrivere. Apri per scrivere. L'apertura della transazione 2 non riesce a causa di un'eccezione ERROR_SHARING_VIOLATION. L'apertura della transazione 2 fallisce con un'eccezione ERROR_SHARING_VIOLATION.
Apri per la lettura. Aperto per SELECT. Entrambi hanno esito positivo. Entrambi hanno esito positivo.
Apri per la lettura. Aprire per AGGIORNARE o ELIMINARE. Entrambi hanno esito positivo. Le operazioni di scrittura nella transazione 2 non influiscono sulle operazioni di lettura eseguite nella transazione 1. Entrambi hanno esito positivo. Le operazioni di scrittura nella transazione 2 non influiscono sulle operazioni di lettura eseguite nella transazione 1.
Apri per scrivere. Apri per SELECT. La transazione 2 si blocca finché la transazione 1 non esegue il commit o termina la transazione, o scade il tempo di attesa del blocco della transazione. Entrambi hanno esito positivo.
Apri per scrivere. Aprire per UPDATE o DELETE. La transazione 2 si blocca fino a quando la transazione 1 non esegue il commit o termina la transazione oppure il timeout del blocco della transazione. La transazione 2 si blocca fino a quando la transazione 1 non esegue il commit o termina la transazione oppure il timeout del blocco della transazione.
Aperto per SELECT. Apri per la lettura. Entrambi hanno esito positivo. Entrambi hanno esito positivo.
Apri per la selezione. Apri per scrivere. Entrambi hanno esito positivo. Le operazioni di scrittura nella transazione 2 non influiscono sulla transazione 1. Entrambi hanno esito positivo. Le operazioni di scrittura nella transazione 2 non influiscono sulla transazione 1.
Aprire per modificare (UPDATE) o cancellare (DELETE). Apri per la lettura. L'operazione di apertura sulla transazione 2 fallisce con un'eccezione ERROR_SHARING_VIOLATION. Entrambi hanno esito positivo.
Aprire per apportare modifiche o eliminare. Apri per scrivere. L'operazione di apertura sulla transazione 2 fallisce con un'eccezione ERROR_SHARING_VIOLATION. L'operazione di apertura sulla transazione 2 fallisce con un'eccezione ERROR_SHARING_VIOLATION.
Aperto per SELECT con lettura ripetibile. Apri per la lettura. Entrambi hanno esito positivo. Entrambi hanno esito positivo.
Aprire per SELECT con lettura ripetuta. Apri per scrivere. L'operazione di apertura sulla transazione 2 fallisce con un'eccezione ERROR_SHARING_VIOLATION. L'operazione di apertura sulla transazione 2 fallisce con un'eccezione ERROR_SHARING_VIOLATION.

Write-Through da client remoti

L'accesso remoto al file system ai dati FILESTREAM è abilitato tramite il protocollo SMB (Server Message Block). Se il client è remoto, nessuna operazione di scrittura viene memorizzata nella cache dal lato client. Le operazioni di scrittura verranno sempre inviate al server. I dati possono essere memorizzati nella cache sul lato server. È consigliabile che le applicazioni in esecuzione su client remoti consolidano operazioni di scrittura di piccole dimensioni per rendere meno operazioni di scrittura con dimensioni maggiori dei dati.

La creazione di viste mappate alla memoria (I/O mappata alla memoria) tramite un handle FILESTREAM non è supportata. Se per i dati FILESTREAM viene usato il mapping di memoria, il motore di database non può garantire coerenza e durabilità dei dati o l'integrità del database.

Attività correlate

Abilitare e configurare FILESTREAM
Creare un database FILESTREAM-Enabled
Creare una tabella per l'archiviazione di dati FILESTREAM
Accedere ai dati FILESTREAM con Transact-SQL
Creare applicazioni client per i dati FILESTREAM
Accesso ai dati FILESTREAM con OpenSqlFilestream
Apportare aggiornamenti parziali ai dati FILESTREAM
Evitare conflitti con le operazioni di database nelle applicazioni FILESTREAM
Spostare il database FILESTREAM-Enabled
Configurare FILESTREAM su un cluster di failover
Configurare un firewall per l'accesso FILESTREAM

Contenuto correlato

Compatibilità FILESTREAM con altre funzionalità di SQL Server