• No se han encontrado resultados

FILESTREAM. Uso de FileStream

N/A
N/A
Protected

Academic year: 2021

Share "FILESTREAM. Uso de FileStream"

Copied!
15
0
0

Texto completo

(1)

FILESTREAM

La mayoría de los daos e información que se crea diariamente no son estructurados, como documentos de texto, imágenes y videos. Estos datos no estructuraos se almacenan de manera habitual fuera de la base de datos, independientemente de sus datos estructurados. Esta separación puede producir algún tipo de complejidad en la administración de dichos datos.

FileStream integra el motor de bases de datos de SQL Server con un sistema de archivos NTFS almacenando los datos de tipo BLOB o varbinnary(max) como archivos en el sistema de archivos. A través de sentencias en Transact-SQL se puede insertar, actualizar, consultar, buscar y realizar copias de seguridad de los datos FileStream. Las interfaces del sistema de archivos Win32 son las que permiten el acceso de la transmisión por secuencia de datos.

Además, destacar que FileStream usa la memoria caché del sistema NT para poder almacenar en memoria caché los datos de archivos. Esto proporciona una ayuda para reducir cualquier efecto que los datos FileStream podrían tener en el rendimiento del motor de la base de datos.

Alguna de las particularidades de este tipo de datos nuevo, es que no es posible cifrar los datos que tengan éste tipo, ni siquiera cuando está habilitado el cifrado de datos transparente.

Uso de FileStream

En SQL Server, los datos BLOB puede ser datos de varbinary(max) estándar que almacenan los datos en tablas u objetos FileStream que almacenan los datos en el sistema de archivos. El tamaño y el uso que se le den este tipo de datos eterminará si se debería usar el almacenamiento propio de la base de

(2)

datos o por el contrario usar el almacenamiento del sistema de archivos. Si se cumplen las siguientes condiciones, entonces lo más adecuado sería utilizar datos FileStream:

Los objetos que está almacenando, son en media más de 1MB de tamaño El acceso de lectura rápido es importante

La aplicación que está desarrollando usa un nivel intermedio para la lógica de la aplicación. Si, no es el caso y usa objetos más pequeños, el almacenamiento de BLOB en la base de datos en términos generales proporciona un rendimiento mejor en la transmisión por secuencias.

Almacenamiento de FileStream

El almacenamiento de FileSream se implementa en una tabla con una columna del tipo varbinary(max) en la que los datos están almacenados como BLOB en el sistema de archivos. El tamaño de los datos de tipo BLOB están limitados sólo por el tamaño del volumen del sistema de archivos. De manera predeterminada el tamaño máximo para varbinary(max) es de 2GB para los que no están almacenados en el sistema de archivos.

Para especificar que una columna debería almacenar los datos que contiene el sistema de archivos, hay que especificar el atributo FILESTREAM en una columna declarada de tipo varbinary(max). Esto hace que el motor de base de datos de SQL Server almacene todos los datos de esa columna en el sistema de archivos y no en los archivos de la base de datos.

Anteriormente, en SQL Server 2005, los grupos de archivos eran PRIMARY y a continuación todos los secundarios que quisiéramos crear, ahora existe un grupo de archivos especial FILESTREAM. Los datos de FILESTREAM deben estar almacenados en los grupos de archivos FILESTREAM, este grupo de archivos contiene los directorios de sistema de archivos en lugar de los propios archivos. Estos directorios de archivos se denominan contenedores de datos, que son la interfaz entre el almacenamiento del motor de la base de datos de SQL Server y el almacenamiento del sistema de archivos.

Cuando nos decidamos a utilizar este tipo de almacenamiento especial, hay que tener presente lo siguiente:

Cuando una tabla contiene una columna de tipo FILESTREAM, cada fila debe contener de manera obligatoria un identificador único distinto de NULL.

Los contenedores de datos FILESTREAM no pueden estar anidados

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

Seguridad Integrada

Los datos FILESTREAM en SQL Server se protegen de la misma manera que el resto de datos, es decir, concediendo permisos en el nivel de tabal o columna. Si un usuario tiene permiso para la columna FILESTREAM de una tabla, el usuario puede abrir los archivos asociados.

Administración Integrada

Ya que FileStream se implementa como una columna de tipo varBinary(max) y se integra en el motor de la base de datos, la mayoría de las funciones y las herramientas de administración de SQL Server

(3)

funcionan sin la modificación de los datos FileStream. Por Ejemplo, si quiere puede utilizar todos y cada uno de los modelos de recuperación y de copia de seguridad con los datos FILESTREAM y lo que es más interesante, se realizan copias de los datos FILESTREAM con los datos estructurados de la base de datos, increíble ¿verdad?. Si no quiere hacer ninguna copia de seguridad de este tipo de datos en conjunto con los datos relacionales, porque no le interesa, pues puede usar una copia de seguridad parcial para no incluir los grupos de archivos FILESTREAM que pudiera tener.

Habilitar FILESTREAM

Para poder utilizar FileStream, se debe habilitar en la instancia de base de datos de SQL Server. Para ello se deben realizar los siguientes pasos:

Primeramente debemos ir a las herramientas de configuración y seleccionar el Administrador de configuración de SQL Server

Una vez tenemos accesible la lista de servicios, debemos seleccionar los servicios de SQL Server

Vamos a las propiedades y en el cuadro de diálogo que aparece, seleccionamos la pestaña que pone FILESTREAM.

En este cuadro de diálogo puede habilitar FILESTREAM para el acceso de transmisión por secuencias de E/S de archivos, debe escribir el nombre de recurso compartido de Windows

Figura 1

Por último, nos vamos a SQL Server Management Studio, y abrimos una nueva consulta y escribimos los siguiente:

(4)

EXEC sp_configure filestream_access_level, 2 RECONFIGURE

Código fuente 1

Administrar datos FILESTREAM usando Transact-SQL

Antes de nada, para poder los ejemplos que se ilustra en éste capítulo es necesario haber habilitado anteriormente en la instancia de servidor FILESTREAM.

Vemos primeramente como insertar una fila que contiene datos FILESTREAM, sabiendo que sólo se pueden insertar valores NULL o valores del tipo varbinary(max).

Diferentes opcines: Insertar NULL

En la siguiente tabla se muestra la forma de utilizar el valor NULL, cuando el valor del FILESTREAM es NULL, el motor de la base de datos de SQL Server no crea un archivo en el sistema de archivos.

INSERT INTO Archive.dbo.Records VALUES(newid(),1,NULL);

Código fuente 2

Insertar un registro de longitud cero

En éste caso, al utilizar INSERT para crear un registro con longitud cero, se obtiene un identificador de archivo que se va a tratar con las API de Win32

INSERT INTO Archive.dbo.Records

VALUES (newid(), 2, CAST(‘’ as varbinary (max)));

Código fuente 3

Crear un archivo de datos

A través de la sentencia INSERT el motor de base de datos convierte la cadena Seismic Data en un valor varbinary(max). FileStream crea el archivo de Windows si aún no existe.

INSERT INTO Archive.dbo.Records

VALUES(newid(),3,cast (‘Seismic Data’ as varbinary(max)))

Código fuente 4

Cuando selecciona todos los datos de la tabla Archive.dbo.Records, los resultaos son similares a los que se muestran en la siguiente tabla. Sin embargo la columna id contendrá GUID diferentes.

Id SerialNumber Resume C871B90F-D25E-47B3-A560-7CC0CA405DAC 1 NULL F8F5C314-0559-4927-8FA9-1535EE0BDF50 2 0x 7F680840-B7A4-45D4-8CD5-527C44D35B3F 3 0x536569736D69632044617461

(5)

Tabla 1

Actualizar datos FILESTREAM

Puede usar Transact-SQL para actualizar los datos del archivo del sistema de archivos; sin embargo, puede no ser conveniente si hay que transmitir por secuencias grandes cantidades de datos a un archivo.

UPDATE Archive.dbo.Records

SET [Chart]=CAST(‘Xray 1’ as varbinary(max)) WHERE[SerualNumber]=2;

Código fuente 5

Eliminar datos FILESTREAM

Al eliminar una fila que contiene un campo FILESTREAM, también elimina sus archivos de sistema de archivos subyacente. La única manera de eliminar una fila y por consiguiene el archivo, es utilizar la instrucción Transact-SQL DELETE.

DELETE Archive.dbo.Records WHERE SerialNumber=1; GO

Código fuente 6

Al seleccionar todos los datos de la tabla dbo.Archive, la fila ya no está. Ya no puede utilizar el archivo asociado.

Administrar daos FILESTREAM usando Win32

Además de Transact-SQL puede utilizar Win32 para leer y escribir datos en un FILESTREAM. Para ello se requiere los siguientes pasos:

Leer la ruta de acceso al archivo FILESTREAM correspondiente Leer el contexto d transacción actual

Obtener un identificador de Win32 y usarlo para leer y escribir los datos en el FILESTREAM. Veamos un poco más en detalle cada uno de estos pasos.

Leer la ruta de acceso al archivo

Cada celda de una tabla FILESTREAM tiene una ruta de acceso al archivo que está asociada a él. Para leer la ruta de acceso, se debe utilizar la propiedad PathName de una columna varbinary(max) en una instrucción Transact-SQL. El siguiente ejemplo lo ilustra.

DECLARE @filePath varchar(max) SELECT @filePath = chart.PathName() FROM Archive.dbo.Records

WHERE SerialNumber=3 PRINT @filepath

(6)

Código fuente 7

Leer el contexto de la transacción

Para obtener el contexto de transacción actual, hay que usar la función GET_FILESTREAM_TRANSACTION_CONTEXT() de Transact-SQL. En el siguiente ejemplo se muestra como se ha de utilizar.

DECLARE @txContxt varbinary(max) BEGIN TRANSACTION

SELECT @txContext = GET_FILESTEAM_TRANSACTION_CONTEXT() PRINT @txContext

COMMIT

Código fuente 8

Obtener un identificador de archivos de Win32

Para Obtener un identificador de archivos Win32, primeramente se ha de llamar a la API OpenSqlFilestream, que se exporta del archivo sqlncli.dll. El identificador que nos devuelve se puede pasar a cualquiera de las siguientes API de Win32: ReadFile, WriteFile, TransmitFile, SetFilePinter, SendEndOfFile o FlushFileBuffers.

La API OpenSqlFilestream

La API OpenSqlFilestream obtiene un identificador de archivos Win32 que es compatible con un objeto binario grande, es decir, un BLOB. El identificador se puede pasar a cualquiera de las API de Win32 siguientes: ReadFile, WriteFile, SetFilePointer, SetEndOfFile o FlushFileBffers. En el caso de que se pase este identificador a cualquiera otra API de Win32, entonces se devuelve un error de tipo ERRO_ACCESS_DENIED. El identificador se debe cerrar al pasarlo a la API Win32 antes de que la transacción se confirme o se devuelva. En el caso de que no pudiera cerrar el identificador, se producirán perdidas en los recursos del lado del servidor.

Destacar. Que TODO el acceso del contenedor de datos de FILESTREAM se debe realizar en una transacción de SQL Server. Las instrucciones de Tranact-SQL también se puede ejecutar en la misma transacción.

Ojo, para poder tener acceso al FILESTREAM BLOB utilizando en éste caso Win32, no olvidar que la autorización de Windows debe estar habilitada.

A continuación se muestra la sintaxis y la definición de cada uno de sus parámetros. HANDLE OpenSqlFilestream( LPCWSTR FilestreamPath, SQL_FILESTREAM_DESIRED_ACCESS DesiredAccess, ULONG OpenOptions, LPBYTE FilestreamTransactionContext, SIZE_T FilestreamTransactionContextLength, PLARGE_INTEGER AllocationSize); Código fuente 9

(7)

Parámetros

FilestreamPath

Es parámetro de entrada y se corresponde a la ruta de acceso nvarchar(max) devuelta por la función PathName. Se debe llamar a PathName desde el contexto de una cuenta que evidentemente tenga los permisos de SELECT y/o UPDATE en la tabla y sobre todo en la columna FILESTREAM.

DesiredAccess

También es un parámetro de entrada y permite establecer el modo utilizado para tener acceso a los datos FILESTREAM, además éste valor se pasa a la función DeviceIoControl.

Nombre Valor Significado

SQL_FILESTREAM_READ 0 Se pueden leer datos de este archivo. SQL_FILESTREAM_WRITE 1 En este archivo se pueden escribir

datos.

SQL_FILESTREAM_READWRITE 2 En este archivo se pueden escribir y leer datos.

Tabla 2

Estos valores quedan definidos o se definen en la enumeración SQL_FILESTREAM_DESIED en el archivo sqlncli.h

OpenOptions

Parámetro de entrada, que especifica los atributos y los marcadores del archivo. También puede incluir cualquier combinación entre los siguientes marcadores.

Marcador Valor Significado

SQL_FILESTREAM_OPEN_NONE 0x00000000: El archivo se abre o se crea sin opciones especiales.

SQL_FILESTREAM_OPEN_FLAG_ASYNC 0x00000001L El archivo se abre o se crea para E/S asincrónica. SQL_FILESTREAM_OPEN_FLAG_NO_BUFFERING 0x00000002L El sistema abre el archivo

sin utilizar el

almacenamiento en caché del sistema.

SQL_FILESTREAM_OPEN_FLAG_NO_WRITE_THROUGH 0x00000004L El sistema no escribe mediante una caché intermedia. La escritura va directamente al disco. SQL_FILESTREAM_OPEN_FLAG_SEQUENTIAL_SCAN 0x00000008L Se tiene acceso a un

archivo de forma secuencial, desde el principio hasta el final. El sistema puede considerar que esto es una

sugerencia para optimizar el almacenamiento en caché del archivo. Si una

(8)

aplicación mueve el puntero de archivo para obtener acceso aleatorio, puede que no se produzca un almacenamiento en caché óptimo.

SQL_FILESTREAM_OPEN_FLAG_RANDOM_ACCESS 0x00000010L Se tiene acceso a un archivo de forma aleatoria. El sistema puede considerar que esto es una sugerencia para optimizar el

almacenamiento en caché del archivo.

Tabla 3

FilestreamTransactionContext

Parámetro de entrada cuyo valor es devuelto por la función GET_FILESTREAM_TRANSACTION_CONTEXT()

FilestreamTransactionContextLength

Parámetro de entrada que especifica el número de bytes en los datos varbinary(max) devueltos por la función GET_FILESTREAM_TRANSACTION_CONTEXT(), además devuelve una matriz de N bytes, siendo N determinada por la función.

AllocationSize

Parámetro de entrada que especifica el tamaño asignado inicialmente al archivo de dtos en bytes, este valor se pasa por alto en modo lectura. En caso de que se produzca algún error en la función, el valor que se devuelve es INVALID_HANDLE_VALUE.

Conflictos entre Win32 y Transact-SQL

Aquellas aplicaciones que utilizan SqlOpenFileStream() para abrir los identificadores de archivos de Win32 con el fin de leer o escribir datos de tipo BLOB de FILESTREAM pueden encontrar errores o conflictos entre las instrucciones en Transact-SQL que se administran en cualquier transacción común. De manera que mi recomendación es que las aplicaciones deben diseñarse de manera cuidadosa para poder ayudar a evitar este tipo de conflictos.

Cuando el motor de base de datos de SQL Server o las propias aplicaciones intentan abrir un archivo BLOB de FILESTREAM, el motor de base de datos de SQL Server primeramente comprueba e contexto de transacciones asociado. Después permite o deniega la solicitud en función de si la operación abierta utiliza instrucciones DDL, instrucciones DML, la recuperación de los datos o la administración de las transacciones.

En la siguiente tabla se especifica como el motor de base de datos de SQL Server determina si una instrucción de Transact-SQL permitirá o denegará en función del tipo de archivos que la transacción intente abrir.

(9)

Instrucciones de Transact-SQL Abierto para lectura

Abierto para escritura

Instrucciones DDL que trabajan con los metadatos de la base de datos, como CREATE TABLE, CREATE INDEX, DROP TABLE y ALTER TABLE.

Permitido Se bloquean y agotan el tiempo de espera con un error.

Instrucciones DML que trabajan con los datos que están almacenados en la base de datos, como UPDATE, DELETE e INSERT.

Permitido Denegado

SELECT Permitido Permitido

COMMIT TRANSACTION Denegado* Denegado*

SAVE TRANSACTION Denegado* Denegado*

ROLLBACK Permitido* Permitido*

Tabla 4

Donde se especifica un asterisco (*) en la tabla, quiere decirse que la transacción se cancela y que se invalidan los identificadores abiertos para el contexto de transacciones, por lo quela aplicación debe cerrar todos los identificadores que en ese momento estén abiertos.

Ejemplos

Veamos algunos de los ejemplos que NO se deben hacer, ya que se crean conflictos.

Abrir un BLOB de FILESTREAM para acceso de escritura

Observar el efecto que se produce al intentar abrir únicamente un archivo para acceso de escritura. dstHandle = OpenSqlFilestream(dstFilePath, Write, 0,

transactionToken, cbTransactionToken, 0);

//Escribir algunos datos al FILESTREAM BLOB.

WriteFile(dstHandle, updateData, …);

//Sentencias DDL que serán denegadas ////Sentencias DML que serán denegadas

//sentencias SELECT que serán permitidas. El FILESTREAM BLOB es //develto sin las modificaciones que se han hecho

//por WriteFile(dstHandle, updateData, …).

CloseHandle(dstHandle);

//sentencias DDL que se permiten //sentencias DML que se permiten

//sentencias SELECT que se permitirán. El FILESTREAM BLOB //es devuelto con el updateData applicado.

Código fuente 10

Abrir un BLOB de FILESTREAM para acceso de lectura

Igual que el ejemplo anterior, pero en este caso el acceso es de sólo lectura. dstHandle = OpenSqlFilestream(dstFilePath, Read, 0,

transactionToken, cbTransactionToken, 0);

//Sentencias DDL que serán denegadas

//Sentencias DML que serán permitidas. Cualquier cambio que se haga en //FILESTREAM no se devolverá hasta

(10)

//que esté cerrado el dstHandle.

//Sentencias SELECT que serán permitidas

CloseHandle(dstHandle);

//Sentencias DDL que serán permitidas //Sentencias DML que serán permitidas //Sentencias SELECT que estarán permitidas.

Código fuente 11

Abrir y cerrar varios archivos BLOB de FILESTREAM

En el caso de que existan varios archivos y estén abiertos, entontes se utiliza la regla más estricta. En siguiente ejemplo se abren dos archivos. El primero de ellos se abre durante la lectura y el segundo para la escritura, de manera que se denegarán las instrucciones de tipo DML hasta que se abra el segundo archivo.

dstHandle = OpenSqlFilestream(dstFilePath, Read, 0, transactionToken, cbTransactionToken, 0);

//Sentencias DDL que serán denegadas //Sentencias DML que serán denegadas //Sentencias SELECT que están permitidas

dstHandle1 = OpenSqlFilestream(dstFilePath1, Write, 0, transactionToken, cbTransactionToken, 0);

//Sentencias DDL que serán denegadas //Sentencias DML que serán denegadas //Sentencias SELECT que serán permitidas

//Cerrar el manejador del lector. El manejador del escritor está todavía abierto

CloseHandle(dstHandle);

//Sentencas DML están todavia denegadas por que el manejador del escritor está abierto.

//Sentencias DDL que serán denegadas //Sentencias DML que serán denegadas //Sentencias SELECT que serán denegadas

CloseHandle(dstHandle1);

//Sentencias DDL que serán permitidas //Sentencias DML que serán permitidas //Sentencias SELECT que serán permitidas

Código fuente 12

No se puede cerrar un cursor

En el siguiente ejemplo se ilustra cómo un cursor de instrucción que no es cerrado puede evitar o causar que OpenSqlFilestream() abra el BLOB para acceso de escritura.

TCHAR *sqlDBQuery =

TEXT("SELECT GET_FILESTREAM_TRANSACTION_CONTEXT(),") TEXT("Chart.PathName() FROM Archive.dbo.Records");

//Ejecutar una sentencia en Transact-SQL que tarde mucho. No permitir //que se complete la sentencia antes de intentar

//abrir el archivo

SQLExecDirect(hstmt, sqlDBQuery, SQL_NTS);

//Después de llamar a OpenSqlFilestream() para abrir cualquier archivo //que el cursor de la sentencia Transact-SQL statement esté siendo usado

(11)

//debe ser cerrado. En éste ejmplo,

//SQLCloseCursor(hstmt) no es llmado por lo que //la transacción indicará que hay un archive //abierto para lectura. Que causará la llamada a

//OpenSqlFilestream() que fallará por que el archive está todavía abierto

HANDLE srcHandle = OpenSqlFilestream(srcFilePath,

Write, 0, transactionToken, cbTransactionToken, 0);

//srcHandle will == INVALID_HANDLE_VALUE porque el cursor está todavia abierto

Código fuente 13

Cómo crear una base de datos habilitada para

FILESTREAM

Ya que un FILESTREAM utiliza un tipo especial de grupo e archivos, cuando cree la base de datos, debe especificar la cláusula CONTAINS FILESTREAM para un grupo de archivos como mínimo.

Crear una base de datos habilitada para FILESTREAM

1. En SQL Server Management Studio, hay que hacer clic en Nueva consulta para mostrar el Editor de consultas.

2. Copie el siguiente código en el editor de consultas. Este código Transact-SQL crea una base de datos habilitada FILESTREAM denominada Archive

3. Para generar la base de datos, haga clic en Ejecutar.

En siguiente código de ejemplo se crea una base de datos con el nombre de Archivo. La base de datos contiene tres grupos de archivos: PRIMARY, Arch1 y FileStreamGroup1. PRIMARY y Arch1 son grupos de archivos normales que no pueden contener datos FILESTREAM. FileStreamGroup1 es el grupo de archivos FILESTREAM.

Para un grupo de archivos FILESTREAM, FILENAME hace referencia a una ruta de acceso. La ruta de acceso hasta la última carpeta debe existir y la última carpeta no debe existir. Para poder realizar este ejemplo, debe existir la carpeta C:\data, aunque la subcarpeta filestream1 no debe existir.

CREATE DATABASE Archive ON

PRIMARY ( NAME = Arch1,

FILENAME = 'c:\data\archdat1.mdf'),

FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM( NAME = Arch3, FILENAME = 'c:\data\filestream1')

LOG ON ( NAME = Archlog1,

FILENAME = 'c:\data\archlog1.ldf') GO

Código fuente 14

Después de ejecutar éste ejemplo, aparecerá un archivo filestream.hdr y una carpeta $FSLOG en la carpeta C:\Data\filestream1. El archivo filestream.hdr es un archivo de encabezado para el contenedor de FILESTREAM. Destacar, que si el disco está formateado como NTFS y además tienes habilitada la compresión, entonces el ejemplo anterior te devuelve el siguiente error:

(12)

The file "c:\data\archdat1.mdf" is compressed but does not reside in a read-only database or filegroup. The file must be decompressed.

Msg 1802, Level 16, State 4, Line 1

CREATE DATABASE failed. Some file names listed could not be created. Check related errors.

Código fuente 15

Para poder solventar, este error, debe ir a la carpeta C:\data Propiedades  Atributos avanzados  No comprobar (contenidos comprimidos para guardar el espacio en disco)

Cómo mover una base de datos habilitada para

FILESTREAM

Para poder mover una base de datos habilitada para FILESTREAM, abra una nueva consulta en el editor de consultas y escriba el siguiente código. Este código muestra la ubicación de los archivos de la base de datos físicos que usa la base de datos FILESTREAM.

USE Archive GO

SELECT type_desc, name, physical_name from sys.database_files

Código fuente 16

Una vez ejecutado este código, escriba lo siguiente y ejecute. Este código pone la base de datos Archive sin conexión.

USE master

EXEC sp_detach_db Archive GO

Código fuente 17

A continuación cree una carpeta en C:\nueva_Carpeta, y mueva a ella los archivos y carpetas que se crearon gracias al código:

USE Archive GO

SELECT type_desc, name, physical_name from sys.database_files

Código fuente 18

Por último ejecute el siguiente código donde se establece la base de datos Archive en línea. USE master

EXEC sp_detach_db Archive GO

CREATE DATABASE Archive ON PRIMARY ( NAME = Arch1,

FILENAME = 'c:\nueva_Carpeta\archdat1.mdf'),

FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM( NAME = Arch3, FILENAME = 'c:\ nueva_Carpeta \filestream1')

LOG ON ( NAME = Archlog1,

FILENAME = 'c:\ nueva_Carpeta \archlog1.ldf') FOR ATTACH

GO

(13)

Crear una tabla para almacenar datos FILESTREAM

Seguimos utilizando la base de datos Archive que hemos estado utilizando en los ejemplos anteriores, abrimos otra vez otra consulta en el editor de consultas y copiamos el siguiente código, en el que se crea una tabla y se habilita para filestream y la vamos a llamar Records.

CREATE TABLE Archive.dbo.Records (

[Id] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE, [SerialNumber] INTEGER UNIQUE,

[Chart] VARBINARY(MAX) FILESTREAM NULL )

GO

Código fuente 20

Cuando la base de datos tiene un grupo de archivos FILESTREAM, entonces es posible el poder crear o modificar tablas para almacenar este tipo de datos. Para poder especificar que una columna puede contener datos FILESTREAM, se tiene que crear una columna de tipo varbinary(max) y además agregar el atributo FILESTREAM.

En este ejemplo, la columna Id es una columna ROWGUIDCOL y es necesaria para usar los datos FILESTREAM con la API de Win32, además la columna SerialNumber es una columna de tipo UNIQUE integer. Por último la columna llamada Chart es una columna FILESTREAM y se usa para almacenar datos en el sistema de archivos.

Prácticas recomendadas

Configuración física y mantenimiento

Cuando instale volúmenes de almacenamiento FILESTREAM, hay que tener en cuenta lo siguiente: Configure y ajuste el nivel RAID que proporcione la tolerancia a errores y el rendimiento requeridos por una aplicación.

Nivel RAID Rendimiento de escritura Rendimiento de lectura Tolerancia a errores Observaciones

RAID 5 Normal Normal Excelente

El rendimiento es mejor que en el caso de un disco o JBOD y menor que RAID 0 o

RAID 5 con creación de bandas.

RAID 0 Excelente Excelente Ninguna RAID 5 con

creación

de bandas Excelente Excelente Excelente Opción más cara.

Tabla 5

Desactivar la opción de nombres cortos de archivo en equipos FILESTREAM. Los nombres cortos de archivo requieren mucho más tiempo para su creación. Para deshabilitar la opción de nombres cortos de archivo, emplee la utilidad fsutil de Windows.

(14)

Deshabilite la indización en volúmenes FILESTREAM y establezca disablelastaccess. Para establecer disablelastaccess, emplee la utilidad fsutil de Windows.

Deshabilite el análisis del antivirus de volúmenes FILESTREAM cuando no sea necesario. Cuando el análisis del antivirus sea necesario, evite el establecimiento de directivas que eliminen automáticamente los archivos causantes del problema.

Use clústeres NTFS de 64 KB. Los volúmenes comprimidos deben establecerse en clústeres NTFS de 4 KB.

Diseño físico de base de datos

Cuando diseñe una base de datos de FILESTREAM, tenga en cuenta las directrices siguientes:

Por razones de rendimiento, los contenedores y grupos de archivos FILESTREAM deben residir en volúmenes distintos del sistema operativo, base de datos de SQL Server, registro de SQL Server, tempdb o archivo de paginación.

Las columnas FILESTREAM deben ir acompañadas de una columna ROWGUID uniqueidentifier correspondiente. Estos tipos de tablas también deben ir acompañados de un índice único. Normalmente, este índice no es un índice clúster. Si la lógica de negocios de bases de datos requiere un índice clúster, debe asegurarse de que los valores almacenados en el índice no sean aleatorios. Los valores aleatorios harán que el índice se vuelva a ordenar cada vez que se agregue o se quite una fila en la tabla.

FILESTREAM no admite directamente la aplicación de directivas ni la administración del espacio. Sin embargo, es posible administrar el espacio y aplicar directivas indirectamente mediante la asignación de cada grupo de archivos FILESTREAM a un volumen independiente y usando las características de administración del volumen.

(15)

Referencias

Documento similar

En un estudio clínico en niños y adolescentes de 10-24 años de edad con diabetes mellitus tipo 2, 39 pacientes fueron aleatorizados a dapagliflozina 10 mg y 33 a placebo,

• Descripción de los riesgos importantes de enfermedad pulmonar intersticial/neumonitis asociados al uso de trastuzumab deruxtecán. • Descripción de los principales signos

Debido al riesgo de producir malformaciones congénitas graves, en la Unión Europea se han establecido una serie de requisitos para su prescripción y dispensación con un Plan

Como medida de precaución, puesto que talidomida se encuentra en el semen, todos los pacientes varones deben usar preservativos durante el tratamiento, durante la interrupción

No había pasado un día desde mi solemne entrada cuando, para que el recuerdo me sirviera de advertencia, alguien se encargó de decirme que sobre aquellas losas habían rodado

Abstract: This paper reviews the dialogue and controversies between the paratexts of a corpus of collections of short novels –and romances– publi- shed from 1624 to 1637:

Por lo tanto, en base a su perfil de eficacia y seguridad, ofatumumab debe considerarse una alternativa de tratamiento para pacientes con EMRR o EMSP con enfermedad activa

The part I assessment is coordinated involving all MSCs and led by the RMS who prepares a draft assessment report, sends the request for information (RFI) with considerations,