SQL Server 2008: Tipo de datos FileStream (I)!

Una de las grandes novedades de SQL Server 2008 en lo que a tipo de datos se refiere es la introducción del tipo de datos FILESTREAM. Algunas de las características de este nuevo tipo de datos son:

  • Almacena grandes ficheros de datos binarios no estructurados directamente en un sistema de ficheros NTFS: documentos, imágenes, etc.
  • Se preserva el control por parte de la BD y la consistencia transaccional.

Un ejemplo de uso de FILESTREAM es  la posibilidad de controlar mediante la base de datos una carpeta de archivos de vídeo.

FILESTREAM al detalle

Si exploramos más en detalle las características de FILESTREAM, nos encontraremos con lo siguiente:

  • Es un atributo de una columna varbinary(max).
  • Especifica que la columna se ha de almacenar en el sistema de ficheros NTFS:
    • La columna sigue siendo manejable mediante comandos T-SQL.
    • Se puede acceder desde el sistema de ficheros y desde la API del SO.
  • Se implementa como una columna varbinary(max) en la que los datos son guardados como BLOBs en el sistema de ficheros:
    • EL tamaño máximo de los BLOBs viene limitado únicamente por el tamaño del volumen de almacenamiento.
    • La limitación estándar de los tipos varbinary(max) de 2 GB no se aplican a estos BLOBs que se almacenan en el sistema de ficheros.

¿Cuándo es recomendable utilizar el tipo de datos FILESTREAM?

  • Se necesita almacenar objetos que ocupan como media más de 1 MB.
  • Es importante el acceso rápido en modo lectura.
  • Se están desarrollando aplicaciones que utilizan una capa intermedia para la lógica de dichas aplicaciones.

Habilitando FILESTREAM

Una vez  que hemos descrito las características del tipo de datos FILESTREAM, vamos a ver como se utiliza. Para ello, lo primero que tenemos que hacer es habilitar la característica FILESTREAM. Para habilitarlo, tenemos  tres opciones (de las cuáles sólo he conseguido que funcione la tercera):

  • De manera visual a través del SQL Server Conguration Manager.
    • Seleccionamos la instancia de SQL Server 2008 y a continuación marcamos la opción Properties.
FileStreamConfiguration_1 FileStreamConfiguration_2 FileStreamConfiguration_3
    • En la pestaña FILESTREAM marcamos la opción de habilitar FILESTREAM y a continuación el tipo de FILESTREAM que queremos utilizar, así como la carpeta compartida dónde se guardarán físicamente los datos.
FileStreamConfiguration_4 FileStreamConfiguration_5
  • A nivel de BD mediante sp_configure @enablelevel, dónde @enablelevel indica:
    • 0 = Deshabilitado. Este es el valor por defecto.
    • 1 = Habilitado solo para acceso T-SQL.
    • 2= Habilitado solo para T-SQL y acceso local al sistema de ficheros.
    • 3= Habilitado para T-SQL, acceso local y remoto al sistema de ficheros.

EXEC sp_configure ‘FileStream’,2

RECONFIGURE

  • Mediante un script de Visual Basic Script (vbs) disponible en Codeplex. Basta con ejecutar este script y reiniciar el servicio de SQL Server para habilitar FILESTREAM en el servidor.

Utilizando FILESTREAM

Una vez que tenemos habilitado FILESTREAM en el servidor, para comenzar a utilizar este tipo de datos:

  • Creamos una base de datos en la que se especifique que contendrá tipo de datos FILESTREAM.

CREATE DATABASE FileStreamTestDB ON PRIMARY

  ( NAME = FileStreamTestDB_data,

    FILENAME = N’C:FileStreamFileStreamTestDBFSTestDB_data.mdf’),

FILEGROUP FileStreamFileGroup CONTAINS FILESTREAM

  ( NAME = FileStreamTestDBDocuments,

    FILENAME = N’C:FileStreamFileStreamTestDBDocuments’)

LOG ON

  ( NAME = ‘FileStreamTestDB_log’,

    FILENAME = N’C:FileStreamFileStreamTestDBFSTestDB_log.ldf’);

GO

De esta forma, estamos especificando que la BD FileStreamTestDB contendrá tipo de datos FILESTREAM, siendo los path físicos para el archivos de BD, los datos FILESTREAM y el archivo de log los indicados en el script anterior. Si examinamos el path C:FileStreamFileStreamTestDB veremos que se han creado los archivos de log y datos para la BD y una carpeta denominada Documents (Nota: A su vez, esta carpeta contendrá una carpeta $FSLOG para los logs de FILESTREAM y el archivo filestream.hdr).

image

  • Creamos dos tablas con columnas definidas como FILESTREAM:

USE FileStreamTestDB;

GO

 

CREATE TABLE FileStreamTest1 (

                        TestId UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE,

                        Name VARCHAR (25),

                        Document VARBINARY(MAX) FILESTREAM);

GO

 

CREATE TABLE FileStreamTest2 (

                        TestId UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE,

                        Name VARCHAR (25),

                        Document1 VARBINARY(MAX) FILESTREAM,

                        Document2 VARBINARY(MAX) FILESTREAM);

GO

Si observamos la carpeta compartida dónde hemos habilitado FILESTREAM, veremos que se ha creado un subdirectorio por cada columna de tipo FILESTREAM definida.

image

  • Insertamos valores en la primera tabla:

INSERT INTO FileStreamTest1 VALUES (

                        NEWID (), ‘Paul Randal’,

                        CAST (” AS VARBINARY(MAX)));

INSERT INTO FileStreamTest1 VALUES (

                        NEWID (), ‘Kimberly Tripp’,

                        CAST (‘Some test data’ AS VARBINARY(MAX)));

GO

Si nos vamos de nuevo a la estructura de carpetas, veremos que en el subdirectorio correspondiente a la columna FILESTREAM de la primera tabla aparecen dos archivos. Uno con tamaño 0 KB y otro con tamaño de X KB. Además, podremos visualizar los datos mediante una sentencia SELECT.

SELECT * FROM FileStreamTest1;

GO

 

image image
  • Si actualizamos los datos del registro en blanco:

UPDATE FileStreamTest1

SET Document = CAST (REPLICATE (‘a’, 8000)

                        AS VARBINARY(MAX))

WHERE Name LIKE ‘%Tripp%’;

GO

Veremos que el archivo original sigue permaneciendo (el de 0 KB, qué será eliminado más adelante por el recolector de basura), pero se crea un nuevo archivo no vacío (cuyo contenido y tamaño es el esperado de acuerdo a la sentencia UPDATE). Sin embargo a nivel de BD, vemos que seguimos teniendo 2 registros, y uno de ellos ha sido actualizado.

image image image

Otros aspectos de FILESTREAM

Otros aspectos a tener en cuenta cuando trabajamos con tipos de datos FILESTREAM son los siguientes:

  • No se soportan:
    • Instantáneas de BD.
    • Encriptación transparente (TDE).
    • Columnas FILESTREAM en parámetros de tabla (TPV).
    • Database Mirroring.
  • Se soporta: Replicación, Log Shipping, Full Text indexing y Microsoft Clustering.
  • SQL Express 2008 tiene soporte para FILESTREAM
  • Las columnas FILESTREAM sólo pueden guardar datos en volúmenes de disco locales (en futuras versiones también en remoto).

Y hasta aquí llega este primer post sobre el tipo de datos FILESTREAM.

Publicado por

Juan Carlos González

Juan Carlos es Ingeniero de Telecomunicaciones por la Universidad de Valladolid y Diplomado en Ciencias Empresariales por la Universidad Oberta de Catalunya (UOC). Cuenta con más de 12 años de experiencia en tecnologías y plataformas de Microsoft diversas (SQL Server, Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira en torno a SharePoint & Office 365. Juan Carlos es MVP de Office Servers & Services desde 2015 (anteriormente fue reconocido por Microsoft como MVP de Office 365 y MVP de SharePoint Server desde 2008 hasta 2015), coordinador del grupo de usuarios .NET de Cantabria (Nuberos.Net, www.nuberos.es), co-fundador y coordinador del Grupo de Usuarios de SharePoint de España (SUGES, www.suges.es), así como co-director de la revista gratuita en castellano sobre SharePoint CompartiMOSS (www.compartimoss.com). Hasta la fecha, ha publicado 8 libros sobre SharePoint & Office 365 y varios artículos en castellano y en inglés sobre ambas plataformas.

6 comentarios en “SQL Server 2008: Tipo de datos FileStream (I)!”

  1. Hola Ascariz,
    Por supuesto que se puede hacer con SQL Server Management Studio R2…FILESTREAM está presente en la última versión de SQL Server e introduce mejoras, sobre todo para el almacenamiento en BLOBs de documentos de SharePoint mediante RBS.

    Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *