SQL Server 2008 FILESTREAM problema

29/10/2008 - 08:03 por santiago.rial.iglesias | Informe spam
Hola, tengo una tabla con un campo varbinay(MAX) con el atributo
FILESTREAM asignado durante la creación de la misma.

Todo funciona perfectamente, al insertar los registros "coloca" el
fichero en la estructura NTFS...

El problema consiste en que si modifico la estructura de la tabla
añadiendo por ejemplo un campo "deja de funcionar" el almacenamiento
en la estructura NTFS y el campo varbinary comienza a comportarse de
forma "tradicional" es decir, los datos se almacenan en la BD.


¿ Qué os parece ?

Saludos.

Preguntas similare

Leer las respuestas

#6 Maxi Accotto
29/10/2008 - 19:32 | Informe spam
Si probalo! igual me gustaria repetir tu problema. Serias tan amable de
pasarme paso a paso todo lo que has hecho ?


Saludos
Maxi Accotto
Microsoft MVP en SQLServer
SQltotalconsulting
-

escribió en el mensaje de
noticias:
Gracias nuevamente Maxi.

Menudo despiste. A ver si soluciona el problema del filestream.

Saludos nuevamente.
Respuesta Responder a este mensaje
#7 santiago.rial.iglesias
01/11/2008 - 11:00 | Informe spam
Hola Maxi,

Todavía no he instalado el fix en el servidor de producción. Primero
voy ha realizar varias pruebas en una maquina virtual...Leyendon las
advertencias de Microsoft respecto a las garantías del parche y que no
se trata de una versión definitiva y demásme da un poco de
"caguele" instalarlo...

Respecto a la descripción del problema:

1) Habilite el uso de FILESTREAM para nivel 3:
exec [sp_filestream_configure] @enable_level = 3;

2) Cree el FileGroup que contendrá la estructura de carpetas generadas
por sqlserver para almacenar los archivos

3) Cree un tabla que además de otros campos tiene un campo GUID y un
varbinary(max):

Adi_ID uniqueidentifier NOT NULL ROWGUIDCOL PRIMARY KEY,
Adi_Documento varbinary(max) FILESTREAM DEFAULT NULL

Si te fijas el campo que contendrá los datos binarios tiene la
propiedad FILESTREAM por lo que su contenido tiene que ser
"almacenado" en los archivos "externos" ubicados en la estructura del
paso 2.


4) Mediante LINQ y desde una página aspx inserto el registro. El
binario lo cargo de valor de la siguientemanera:

byte[] inputBuffer System.IO.File.ReadAllBytes(Server.MapPath("ad/upload/" +
txt_Adi_Archivo_Nombre.Text));
Adi.Adi_Documento = new
System.Data.Linq.Binary(inputBuffer);

5) Realizo el SubmitChanges y el registro se inserta correctamente. Si
realizo una consulta con Adi_Documento.PathName() el sql me devuelve
la ruta del archivo perfectamente.


6) INSERTO UN NUEVO CAMPO EN LA TABLA Y GUARDO LOS CAMBIOS (desde
management console)

7) Vuelvo a repetir el paso 4 (inserción de registro)

8) PROBLEMA -> El contenido del archivo asociado al ultimo registro
(paso 7) no se almacena como FILESTREAM. Se almacena como un varbinary
normal, es decir no se genera un archivo en la estructura NTFS.

Si intento hacer una nueva consulta con Adi_Documento.PathName() se
muestra un error diciendo que el campo "debe ser del tipo FILESTREAM".




La única solución que he encontrado es crear la tabla nuevamente desde
cero.


Espero que te sirva. Saludos.
Respuesta Responder a este mensaje
#8 Jose Antonio
02/11/2008 - 13:27 | Informe spam
Si ese problema se produce cuando tu insertas una columna nueva en la tabla
filestream y debido a que has cambiado el orden de las columnas la tabla se
vuelve a crear.

Si tu añades la columna al final de la tabla y esta no debe volver a
generarse nuevamente todo funciona correctamente.

Entiendo que es un bug, pero no se si microsoft lo ha solucionado ya.


escribió en el mensaje
news:
Hola Maxi,

Todavía no he instalado el fix en el servidor de producción. Primero
voy ha realizar varias pruebas en una maquina virtual...Leyendon las
advertencias de Microsoft respecto a las garantías del parche y que no
se trata de una versión definitiva y demásme da un poco de
"caguele" instalarlo...

Respecto a la descripción del problema:

1) Habilite el uso de FILESTREAM para nivel 3:
exec [sp_filestream_configure] @enable_level = 3;

2) Cree el FileGroup que contendrá la estructura de carpetas generadas
por sqlserver para almacenar los archivos

3) Cree un tabla que además de otros campos tiene un campo GUID y un
varbinary(max):

Adi_ID uniqueidentifier NOT NULL ROWGUIDCOL PRIMARY KEY,
Adi_Documento varbinary(max) FILESTREAM DEFAULT NULL

Si te fijas el campo que contendrá los datos binarios tiene la
propiedad FILESTREAM por lo que su contenido tiene que ser
"almacenado" en los archivos "externos" ubicados en la estructura del
paso 2.


4) Mediante LINQ y desde una página aspx inserto el registro. El
binario lo cargo de valor de la siguientemanera:

byte[] inputBuffer System.IO.File.ReadAllBytes(Server.MapPath("ad/upload/" +
txt_Adi_Archivo_Nombre.Text));
Adi.Adi_Documento = new
System.Data.Linq.Binary(inputBuffer);

5) Realizo el SubmitChanges y el registro se inserta correctamente. Si
realizo una consulta con Adi_Documento.PathName() el sql me devuelve
la ruta del archivo perfectamente.


6) INSERTO UN NUEVO CAMPO EN LA TABLA Y GUARDO LOS CAMBIOS (desde
management console)

7) Vuelvo a repetir el paso 4 (inserción de registro)

8) PROBLEMA -> El contenido del archivo asociado al ultimo registro
(paso 7) no se almacena como FILESTREAM. Se almacena como un varbinary
normal, es decir no se genera un archivo en la estructura NTFS.

Si intento hacer una nueva consulta con Adi_Documento.PathName() se
muestra un error diciendo que el campo "debe ser del tipo FILESTREAM".




La única solución que he encontrado es crear la tabla nuevamente desde
cero.


Espero que te sirva. Saludos.
Respuesta Responder a este mensaje
#9 choquito
02/11/2008 - 20:30 | Informe spam
Hola Jose Antonio,

Gracias por tú interés. La verdad no se me habia ocurrido insertar el campo
al final.

Respecto a esto que comentas hay algun documento técnico donde se profundice
en el asunto?

Seguiré investigando. Gracias nuevamente.
Respuesta Responder a este mensaje
#10 Jose Antonio
02/11/2008 - 21:20 | Informe spam
No hay ningun documento tecnico, esto lo descubri haciendo varias pruebas.

Es más no se si los beta tester se lo han reportado a microsoft.
"choquito" escribió en el mensaje
news:
Hola Jose Antonio,

Gracias por tú interés. La verdad no se me habia ocurrido insertar el
campo al final.

Respecto a esto que comentas hay algun documento técnico donde se
profundice en el asunto?

Seguiré investigando. Gracias nuevamente.





email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida