Tablas temporales en SQL Server

25/02/2005 - 10:19 por Juan Pedro Gonzalez | Informe spam
Hola,

Se me ha presentado un pequeño problema de desarrollo, os lo explico a
continuacion para ver si alguien me puede hechar un cable.

En un formulario de VB .NET tengo una serie de datos que debe introducirse
en una base de datos de SQL Server (en tres tablas). Me gustaria evitar la
corrupcion de los datos en el SQL Server, y existen problemas con la red.
Para solucionar este problema se me ocurrio emplear XML, pero algunos de los
datos son strings, y podrian enviar comillas produciendo errores en el
XML... Por ello se me ocurrio crear un procedimiento que generase dos tablas
temporales (#primera y #segunda). Desde VB .NET trato de introducir los
datos en dichas tablas temporales y una vez que todo ha sido realizado sin
errores llamo a un segundo procedimiento almacenado que copiara los datos de
dichas tablas a las tablas reales.

El problema se presenta con los INSERT del VB .NET, ya que cuando llamo a
#primera me dice que el nombre de la tabla no es valido. ¿Como se emplea una
tabla temporal desde VB .NET?

Tambien me ha surgido otra duda: ¿Donde puedo ver la tabla temporal?
Especialmente para poder observar si la tabla se ha generado
correctamente... Yo pensaba que era en Tempdb pero no se puede ver nada...

Y ya puestos a preguntar... Los usuario se conectan a la base de datos
empleando autenticacion SQL Server, y acceden a la base de datos a traves de
un Rol de aplicacion. La Tabla temporal se genera para su login de usuario o
para el rol de aplicacion? Supongo que sera para su login de usuario, ya que
es el que contendra la informacion de la sesion, y aparte de eso, si acaba
en TempDB dudo que coja el rol de aplicacion de la otra base de datos.

Tambien me pregunto si la tabla temporal solo puede ser accedida por el
usuario que la ha creado (No es una tabla temporal global), o si se deberia
aplicar algun tipo de seguridad adicional para evitar que otro usuario la
consulte.

Un saludo

Preguntas similare

Leer las respuestas

#1 A.Poblacion
25/02/2005 - 11:17 | Informe spam
"Juan Pedro Gonzalez" wrote in message
news:%
[...] un procedimiento que generase dos tablas
temporales (#primera y #segunda). Desde VB .NET trato de introducir los
datos en dichas tablas temporales y una vez que todo ha sido realizado sin
errores llamo a un segundo procedimiento almacenado que copiara los datos


de
dichas tablas a las tablas reales.

El problema se presenta con los INSERT del VB .NET, ya que cuando llamo a
#primera me dice que el nombre de la tabla no es valido. ¿Como se emplea


una
tabla temporal desde VB .NET?



¿Después de crear las tablas, haces el Insert con la misma conexión, sin
cerrarla entre medias? Lo digo porque las tablas temporales dependen de la
conexión, y al cerrarla se borran. Si queres que sean "globales", puedes
poner "##Tabla", pero ojo, que entonces son comunes a todos los usuarios.
Respuesta Responder a este mensaje
#2 A.Poblacion
25/02/2005 - 11:17 | Informe spam
"Juan Pedro Gonzalez" wrote in message
news:%
[...] un procedimiento que generase dos tablas
temporales (#primera y #segunda). Desde VB .NET trato de introducir los
datos en dichas tablas temporales y una vez que todo ha sido realizado sin
errores llamo a un segundo procedimiento almacenado que copiara los datos


de
dichas tablas a las tablas reales.

El problema se presenta con los INSERT del VB .NET, ya que cuando llamo a
#primera me dice que el nombre de la tabla no es valido. ¿Como se emplea


una
tabla temporal desde VB .NET?



¿Después de crear las tablas, haces el Insert con la misma conexión, sin
cerrarla entre medias? Lo digo porque las tablas temporales dependen de la
conexión, y al cerrarla se borran. Si queres que sean "globales", puedes
poner "##Tabla", pero ojo, que entonces son comunes a todos los usuarios.
Respuesta Responder a este mensaje
#3 Juan
25/02/2005 - 11:23 | Informe spam
No, yo no la cierro, salvo que se cierre previamente por un error... pero la
clase que he creado de base de datos no me devuelve un error, por lo que no
creo que sea por eso. Las tablas globales no me sirven ya que pueden existir
varios usuarios empleandolas y no me gustaria tener que introducir
identificadores de usuario, ademas no me interesa que sea legible por todo
el mundo por motivos legales (LOPD)...

Por lo que he leido por ahi, parece que es procedimiento almacenado es el
propietario de la tabla temporal y no el usuario... Aun si esto es asi no
entiendo porque no puedo visualizar la tabla para comprobar que se ha creado
correctamente. ¿Donde estaban las tablas temporales?

Saludos

"A.Poblacion" escribió en
el mensaje news:
¿Después de crear las tablas, haces el Insert con la misma conexión,


sin
cerrarla entre medias? Lo digo porque las tablas temporales dependen de la
conexión, y al cerrarla se borran. Si queres que sean "globales", puedes
poner "##Tabla", pero ojo, que entonces son comunes a todos los usuarios.
Respuesta Responder a este mensaje
#4 Juan
25/02/2005 - 11:23 | Informe spam
No, yo no la cierro, salvo que se cierre previamente por un error... pero la
clase que he creado de base de datos no me devuelve un error, por lo que no
creo que sea por eso. Las tablas globales no me sirven ya que pueden existir
varios usuarios empleandolas y no me gustaria tener que introducir
identificadores de usuario, ademas no me interesa que sea legible por todo
el mundo por motivos legales (LOPD)...

Por lo que he leido por ahi, parece que es procedimiento almacenado es el
propietario de la tabla temporal y no el usuario... Aun si esto es asi no
entiendo porque no puedo visualizar la tabla para comprobar que se ha creado
correctamente. ¿Donde estaban las tablas temporales?

Saludos

"A.Poblacion" escribió en
el mensaje news:
¿Después de crear las tablas, haces el Insert con la misma conexión,


sin
cerrarla entre medias? Lo digo porque las tablas temporales dependen de la
conexión, y al cerrarla se borran. Si queres que sean "globales", puedes
poner "##Tabla", pero ojo, que entonces son comunes a todos los usuarios.
Respuesta Responder a este mensaje
#5 Eladio Rincón
25/02/2005 - 12:40 | Informe spam
Juan,

has comentado que la tabla temporal la creas dentro del procedimiento
almacenado; este ejemplo reproduce lo que te sucede:

use northwind
go
drop proc proc_test
go
create proc proc_test
as
select * into #t from Orders
go

exec proc_test
select * from #t

tienes que tener en cuenta que cuando sales del ámbito de procedimiento
almacenado, la tabla temporal se destruye, por eso el error que se produce
en el select:

Server: Msg 208, Level 16, State 1, Line 4
Invalid object name '#t'.

por lo que veo en tu mensaje parece que quieres insertar datos en local (sin
tener que acceder a SQL Server), y en un momento determinado "consolidar"
esos datos en el servidor, ¿es correcto? cuentanos un poco más del
proceso...


Eladio Rincón
SQL Server MVP

Solid Quality Learning (http://www.solidqualitylearning.com)
"Comparte lo que sabes, aprende lo que no sepas", FGG

Consulte el histórico del grupo en Google
http://groups.google.com/groups?gro....sqlserver

¿Te interesa participar en las reuniones
del grupo de Usuarios de SQL-Server y .NET
Se harán en levante de España, (Alicante o Murcia)?

"Juan Pedro Gonzalez" wrote in message
news:#
Hola,

Se me ha presentado un pequeño problema de desarrollo, os lo explico a
continuacion para ver si alguien me puede hechar un cable.

En un formulario de VB .NET tengo una serie de datos que debe introducirse
en una base de datos de SQL Server (en tres tablas). Me gustaria evitar la
corrupcion de los datos en el SQL Server, y existen problemas con la red.
Para solucionar este problema se me ocurrio emplear XML, pero algunos de


los
datos son strings, y podrian enviar comillas produciendo errores en el
XML... Por ello se me ocurrio crear un procedimiento que generase dos


tablas
temporales (#primera y #segunda). Desde VB .NET trato de introducir los
datos en dichas tablas temporales y una vez que todo ha sido realizado sin
errores llamo a un segundo procedimiento almacenado que copiara los datos


de
dichas tablas a las tablas reales.

El problema se presenta con los INSERT del VB .NET, ya que cuando llamo a
#primera me dice que el nombre de la tabla no es valido. ¿Como se emplea


una
tabla temporal desde VB .NET?

Tambien me ha surgido otra duda: ¿Donde puedo ver la tabla temporal?
Especialmente para poder observar si la tabla se ha generado
correctamente... Yo pensaba que era en Tempdb pero no se puede ver nada...

Y ya puestos a preguntar... Los usuario se conectan a la base de datos
empleando autenticacion SQL Server, y acceden a la base de datos a traves


de
un Rol de aplicacion. La Tabla temporal se genera para su login de usuario


o
para el rol de aplicacion? Supongo que sera para su login de usuario, ya


que
es el que contendra la informacion de la sesion, y aparte de eso, si acaba
en TempDB dudo que coja el rol de aplicacion de la otra base de datos.

Tambien me pregunto si la tabla temporal solo puede ser accedida por el
usuario que la ha creado (No es una tabla temporal global), o si se


deberia
aplicar algun tipo de seguridad adicional para evitar que otro usuario la
consulte.

Un saludo


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida