Información general de FILESTREAM

Muchos de los datos que se crean todos los días son datos no estructurados, como documentos de texto, imágenes y vídeos. Estos datos no estructurados se almacenan fuera de la base de datos a menudo, independientemente de sus datos estructurados. Esta separación puede producir complejidades en la administración de datos. O bien, si los datos están asociados a almacenamiento estructurado, se pueden limitar las capacidades de transmisión por secuencias de archivo y rendimiento.

FILESTREAM integra SQL Server Database Engine (Motor de base de datos de SQL Server) con un sistema de archivos NTFS almacenando los datos de objeto binario grande (BLOB) varbinary(max) como archivos en el sistema de archivos. Las instrucciones de Transact-SQL pueden insertar, actualizar, consultar, buscar y realizar copias de seguridad de los datos FILESTREAM. Las interfaces del sistema de archivos de Win32 proporcionan el acceso de la transmisión por secuencias a los datos.

FILESTREAM usa la memoria caché del sistema NT para almacenar en memoria caché los datos de archivos. Esto ayuda a reducir cualquier efecto que los datos FILESTREAM podrían tener en el rendimiento de Database Engine (Motor de base de datos). No se usa el grupo de búferes de SQL Server; por consiguiente, esta memoria está disponible para el procesamiento de consultas.

[!NOTA]

Los datos FILESTREAM no se cifran ni siquiera cuando está habilitado el cifrado de datos transparente.

Para un tutorial que muestra cómo usar FILESTREAM, vea Introducción al almacenamiento mediante FILESTREAM.

Cuándo se usa FILESTREAM

En SQL Server, BLOB pueden ser datos de varbinary(max) estándar que almacena los datos en tablas u objetos FILESTREAM varbinary(max) que almacenan los datos en el sistema de archivos. El tamaño y el uso de los datos determinan si debería usar el almacenamiento de base de datos o el almacenamiento del sistema de archivos. Si las condiciones siguientes son verdaderas, debería pensar en usar FILESTREAM:

  • Los objetos que se están almacenando son, por término medio, mayores de 1 MB.

  • El acceso de lectura rápido es importante.

  • Está desarrollando aplicaciones que usan un nivel intermedio para la lógica de la aplicación.

Para objetos más pequeños, el almacenamiento de BLOB varbinary(max) en la base de datos a menudo proporciona un mejor rendimiento de la transmisión por secuencias.

Almacenamiento de FILESTREAM

El almacenamiento de FILESTREAM se implementa como una columna varbinary(max) en la que los datos están almacenados como BLOB en el sistema de archivos. Los tamaños de los BLOB están limitados sólo por el tamaño del volumen del sistema de archivos. La limitación varbinary(max) estándar de tamaños de archivo de 2 GB no se aplica a BLOB que están almacenados en el sistema de archivos.

Para especificar que una columna debería almacenar datos en el sistema de archivos, especifique el atributo FILESTREAM en una columna varbinary(max). Esto hace que Database Engine (Motor de base de datos) almacene todos los datos para esa columna en el sistema de archivos pero no en el archivo de base de datos.

Los datos de FILESTREAM deben estar almacenados en los grupos de archivos FILESTREAM. Un grupo de archivos FILESTREAM es un grupo de archivos especial que contiene los directorios de sistema de archivos en lugar de los propios archivos. Estos directorios del sistema de archivos se denominan contenedores de datos. Los contenedores de datos son la interfaz entre el almacenamiento del Database Engine (Motor de base de datos) y el almacenamiento del sistema de archivos.

Cuando use el almacenamiento FILESTREAM, piense en lo siguiente:

  • Cuando una tabla contiene una columna FILESTREAM, cada fila debe tener un identificador de fila único distinto de NULL.

  • Los contenedores de datos FILESTREAM no pueden estar anidados.

  • Al estar usando la agrupación en clústeres de conmutación por error, los grupos de archivos FILESTREAM deben estar en recursos de disco compartido.

  • Los grupos de archivos FILESTREAM pueden estar en volúmenes comprimidos.

Seguridad integrada

En SQL Server, los datos de FILESTREAM se protegen de la misma manera que los demás datos: concediendo permisos en el nivel de tabla o columna. Si un usuario tiene permiso para la columna FILESTREAM de una tabla, el usuario puede abrir los archivos asociados.

[!NOTA]

El cifrado no se admite en los datos FILESTREAM.

Sólo a la cuenta con la que la cuenta de servicio de SQL Server se ejecuta se permiten los permisos NTFS al contenedor FILESTREAM. Recomendamos que a ninguna otra cuenta se le concedan los permisos concedidos en el contenedor de datos.

Administración integrada

Debido a que FILESTREAM se implementa como una columna varbinary(max) y se integra directamente en el Database Engine (Motor de base de datos), la mayoría de las funciones y las herramientas de administración de SQL Server funcionan sin la modificación de los datos FILESTREAM. Por ejemplo, puede usar todos los modelos de recuperación y copia de seguridad con datos FILESTREAM y se realizan copias de seguridad de los datos FILESTREAM con los datos estructurados de la base de datos. Si no desea realizar una copia de seguridad de los datos FILESTREAM con datos relacionales, puede usar una copia de seguridad parcial para excluir los grupos de archivos FILESTREAM.

Modelo de programación dual para obtener acceso a los datos de BLOB

Después de almacenar los datos en una columna FILESTREAM, puede tener acceso a los archivos usando las transacciones de Transact-SQL o usando las API de Win32.

Acceso a Transact-SQL

Usando Transact-SQL, puede insertar, actualizar y eliminar los datos de FILESTREAM:

  • Puede usar una operación de inserción para rellenar previamente un campo FILESTREAM con un valor nulo, un valor vacío o un dato insertado relativamente corto. Sin embargo, se envía una gran cantidad de datos de manera más eficaz en un archivo que usa interfaces de Win32.

  • Al actualizar un campo FILESTREAM, modifica los datos de BLOB subyacentes en el sistema de archivos. Cuando un campo FILESTREAM está establecido en NULL, se eliminan los datos de BLOB asociados al campo. No puede usar ninguna actualización fragmentada de Transact-SQL, implementada como UPDATE**.**Write (), para realizar actualizaciones parciales en los datos.

  • Al eliminar una fila, o eliminar o truncar una tabla que contiene datos FILESTREAM, elimina los datos de BLOB subyacentes del sistema de archivos.

Acceso a la transmisión por secuencias del sistema de archivos

La compatibilidad de transmisión por secuencias de Win32 funciona en el contexto de una transacción de SQL Server. Dentro de una transacción, puede usar las funciones FILESTREAM para obtener una ruta de acceso al sistema de archivos de UNC lógica de un archivo. A continuación, use la API de OpenSqlFilestream para obtener un identificador de archivos. Después, este identificador lo pueden usar las interfaces de transmisión por secuencias de archivo de Win32, como ReadFile() y WriteFile(), para obtener acceso y actualizar el archivo mediante el sistema de archivos.

Dado que las operaciones de archivo son transaccionales, no puede eliminar ni cambiar el nombre de los archivos FILESTREAM a través del sistema de archivos.

Modelo de la instrucción

El acceso del sistema de archivos de FILESTREAM modela una instrucción de Transact-SQL usando la apertura y el cierre de archivo. La instrucción se inicia cuando un identificador de archivos se abre y finaliza cuando se cierra el identificador. Por ejemplo, cuando se cierra un identificador de escritura, cualquier posible desencadenador de AFTER que esté registrado en la tabla se desencadena como si la instrucción UPDATE estuviera completada.

Espacio de nombres de almacenamiento

En FILESTREAM, el Database Engine (Motor de base de datos) controla el espacio de nombres del sistema de archivos físico de BLOB. Una nueva función intrínseca, PathName, proporciona la ruta UNC lógica del BLOB que se corresponde con cada celda de FILESTREAM de la tabla. La aplicación usa esta ruta de acceso lógica para obtener el identificador de Win32 y funcionar en los datos de BLOB usando las interfaces del sistema de archivos de Win32 normales. La función devuelve NULL si el valor de la columna FILESTREAM es NULL.

Acceso al sistema de archivos transaccionales

Una nueva función intrínseca, GET_FILESTREAM_TRANSACTION_CONTEXT (), proporciona el token que representa la transacción actual a la que la sesión está asociada. Se debe haber iniciado la transacción y no haberse abortado ni confirmado todavía. Al obtener un token, la aplicación enlaza las operaciones de transmisión por secuencias del sistema de archivos FILESTREAM con una transacción iniciada. La función devuelve NULL en caso de no haber ninguna transacción explícitamente iniciada.

Se deben cerrar todos los identificadores de archivo antes de que la transacción se confirme o se anule. Si un identificador se deja abierto más allá del ámbito de transacción, las lecturas adicionales frente al identificador producirán un error; las escrituras adicionales frente al identificador tendrán éxito pero los datos reales no se escribirán en el disco. De igual forma, si la base de datos o la instancia del Database Engine (Motor de base de datos) se cierra, se invalidan todos los identificadores abiertos.

Durabilidad transaccional

Con FILESTREAM, al confirmar la transacción, el Database Engine (Motor de base de datos) asegura la durabilidad de la transacción para los datos de BLOB FILESTREAM que se modifican del acceso a la transmisión por secuencias del sistema de archivos.

Semántica de aislamiento

La semántica de aislamiento se rige por los niveles de aislamiento de transacción del Database Engine (Motor de base de datos). Sólo se admite el nivel de aislamiento de lectura confirmada para el acceso al sistema de archivos. Se admiten operaciones de lectura repetibles, y también serializables y aislamientos de instantáneas, cuando se tiene acceso a los datos FILESTREAM usando Transact-SQL. No se admite la lectura de datos sucios.

Las operaciones de apertura de acceso al sistema de archivos no esperan ningún bloqueo. En su lugar, se produce un error inmediato de las operaciones de apertura si no pueden obtener acceso a los datos debido al aislamiento de transacción. Se produce un error en las llamadas de API de transmisión por secuencias con ERROR_SHARING_VIOLATION si la operación de apertura no puede continuar debido a la infracción de aislamiento.

Actualizaciones parciales

Para permitir que se realicen actualizaciones parciales, la aplicación puede emitir un control FS de dispositivo (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) para capturar el contenido anterior en el archivo al que hace referencia el identificador abierto. Esto desencadenará una copia de contenido antiguo de servidor. Para un mejor rendimiento de la aplicación, y para evitar encontrarse con posibles tiempos de espera mientras trabaja con archivos muy grandes, recomendamos que use E/S asincrónica.

Si se emite FSCTL una vez se haya escrito en el identificador, se conservará la última operación de escritura y se perderán las escrituras anteriores realizadas en el identificador.

Escritura continua desde clientes remotos

El acceso al sistema de archivos remoto a los datos de FILESTREAM está habilitado por el protocolo Bloque de mensajes de servidor (SMB). Si el cliente es remoto, no se almacena en caché ninguna operación de escritura por el cliente. Las operaciones de escritura siempre se enviarán al servidor. Los datos pueden se pueden almacenar en memoria caché en el servidor. Recomendamos que las aplicaciones que se están ejecutando en clientes remotos consoliden pequeñas operaciones de escritura para realizar menos operaciones de escritura mediante un tamaño de datos mayor.

No se admite la creación de vistas asignadas de memoria (E/S asignada de memoria) usando un identificador FILESTREAM. Si la asignación de memoria se usa para los datos FILESTREAM, el Database Engine (Motor de base de datos) no pueden garantizar la coherencia y la durabilidad de los datos o la integridad de la base de datos.