Trigger y tabla temporal

02/10/2007 - 01:10 por CHAR72 | Informe spam
Hola compañeros: tengo un problema para un triger cuando elimina datos. El
tema es asi, al inicia mi app creo una tabla temporal de sesion e inserto un
valor (la idea de variables globales) luego en triger usar ese valor, el
triger funciona perfecto excepto para las eliminaciones que no toma el valor
de Usuario_ID, (toma -1) como si no encontrase la tabla temporal.
Agradeceria me indique porque para los insert o update si funciona y para
los delete no.

Saludos

Carlos

PD: es un SQL2000



CREATE TRIGGER Domicilios_Audit ON [dbo].[Domicilios]
FOR INSERT, UPDATE, DELETE
AS

DECLARE @Ins int,@Del int
DECLARE @Usuario_ID smallint
EXEC sp_GetUsuario_ID @Usuario_ID OUTPUT

SELECT @Ins=COUNT(*) FROM Inserted
SELECT @Del=COUNT(*) FROM Deleted

IF @Ins<>0 AND @Del=0
INSERT INTO AUDITORIA_Domicilios(Estante,A_D,Columna,Fila,Usuario_ID,Tipo)
SELECT Estante,A_D,Columna,Fila,Usuario_ID=@Usuario_ID,Tipo='I' FROM
Inserted
ELSE
IF @Ins=0 AND @Del<>0
INSERT INTO AUDITORIA_Domicilios(Estante,A_D,Columna,Fila,Usuario_ID,Tipo)
SELECT Estante,A_D,Columna,Fila,Usuario_ID=@Usuario_ID,Tipo='D' FROM Deleted
ELSE
INSERT INTO AUDITORIA_Domicilios(Estante,A_D,Columna,Fila,Usuario_ID,Tipo)
SELECT Estante,A_D,Columna,Fila,Usuario_ID=@Usuario_ID,Tipo='U' FROM
Inserted



CREATE PROCEDURE sp_GetUsuario_ID @Usuario_ID smallint OUTPUT AS

IF Object_id('tempdb.dbo.#Variables') IS NULL
SELECT @Usuario_ID=-1
ELSE
SELECT @Usuario_ID=Usuario_ID FROM #Variables
GO


-

Preguntas similare

Leer las respuestas

#1 Enrique Catala Bañuls
02/10/2007 - 19:53 | Informe spam
Hola, revisando el código que has puesto lo único que se me ocurre que puedes
mirar es ver si la tabla temporal local #Variables existe en la sesión.

Evidentemente te esta detectando que no existe el objeto de tabla temporal y
te devuelve -1 y eso puede ser debido a que a la hora de hacer el delete
estas en una sesión diferente. Comprueba que en ningun momento pierdes la
conexión y la vuelves a abrir, que no lanzas el delete bajo una conexión
diferente, que todo el tema de las transacciones te esta funcionando bien,...

Para salir de dudas, puedes probar a crear una tabla global ( ##Variable ) y
ver si así te sigue funcionando, con lo que sabras que es un problema de
sesión de BBDD y sabras que el problema esta en la capa de acceso a datos de
tu aplicación.

Al margen de todo esto, intenta evitar las tablas temporales , se llevan muy
mal con la escalabilidad ;) Si puedes sacar tu tabla de variables a tu
aplicación cliente hazlo ( sesion del navegador, objeto en memoria de la
aplicacion cliente,... ).


Atentamente, Enrique Catala Bañuls


"CHAR72" wrote:

Hola compañeros: tengo un problema para un triger cuando elimina datos. El
tema es asi, al inicia mi app creo una tabla temporal de sesion e inserto un
valor (la idea de variables globales) luego en triger usar ese valor, el
triger funciona perfecto excepto para las eliminaciones que no toma el valor
de Usuario_ID, (toma -1) como si no encontrase la tabla temporal.
Agradeceria me indique porque para los insert o update si funciona y para
los delete no.

Saludos

Carlos

PD: es un SQL2000



CREATE TRIGGER Domicilios_Audit ON [dbo].[Domicilios]
FOR INSERT, UPDATE, DELETE
AS

DECLARE @Ins int,@Del int
DECLARE @Usuario_ID smallint
EXEC sp_GetUsuario_ID @Usuario_ID OUTPUT

SELECT @Ins=COUNT(*) FROM Inserted
SELECT @Del=COUNT(*) FROM Deleted

IF @Ins<>0 AND @Del=0
INSERT INTO AUDITORIA_Domicilios(Estante,A_D,Columna,Fila,Usuario_ID,Tipo)
SELECT Estante,A_D,Columna,Fila,Usuario_ID=@Usuario_ID,Tipo='I' FROM
Inserted
ELSE
IF @Ins=0 AND @Del<>0
INSERT INTO AUDITORIA_Domicilios(Estante,A_D,Columna,Fila,Usuario_ID,Tipo)
SELECT Estante,A_D,Columna,Fila,Usuario_ID=@Usuario_ID,Tipo='D' FROM Deleted
ELSE
INSERT INTO AUDITORIA_Domicilios(Estante,A_D,Columna,Fila,Usuario_ID,Tipo)
SELECT Estante,A_D,Columna,Fila,Usuario_ID=@Usuario_ID,Tipo='U' FROM
Inserted



CREATE PROCEDURE sp_GetUsuario_ID @Usuario_ID smallint OUTPUT AS

IF Object_id('tempdb.dbo.#Variables') IS NULL
SELECT @Usuario_ID=-1
ELSE
SELECT @Usuario_ID=Usuario_ID FROM #Variables
GO


-





Respuesta Responder a este mensaje
#2 CHAR72
03/10/2007 - 01:25 | Informe spam
Hola Enrique, no es problema de sesion, pues esta en la misma sesión, de eso
estoy seguro, ademas lo probe con el QA con la misma sesión y pasa lo mismo,
ademas aparentemente es algo con los triger y las eliminaciones pues tiene
lo mismo con el insert y funciona de maravilla, esto es una solución
¨temporal¨y porque estoy tratando de auditar un inconveniente en mi sistema,
no fue una solución "digna"pero bueno... es lo que hay.

Saludos e intentare continuar buscando el origen del inconveniesnte.


"Enrique Catala Bañuls"
escribió en el mensaje
news:
Hola, revisando el código que has puesto lo único que se me ocurre que
puedes
mirar es ver si la tabla temporal local #Variables existe en la sesión.

Evidentemente te esta detectando que no existe el objeto de tabla temporal
y
te devuelve -1 y eso puede ser debido a que a la hora de hacer el delete
estas en una sesión diferente. Comprueba que en ningun momento pierdes la
conexión y la vuelves a abrir, que no lanzas el delete bajo una conexión
diferente, que todo el tema de las transacciones te esta funcionando
bien,...

Para salir de dudas, puedes probar a crear una tabla global ( ##Variable )
y
ver si así te sigue funcionando, con lo que sabras que es un problema de
sesión de BBDD y sabras que el problema esta en la capa de acceso a datos
de
tu aplicación.

Al margen de todo esto, intenta evitar las tablas temporales , se llevan
muy
mal con la escalabilidad ;) Si puedes sacar tu tabla de variables a tu
aplicación cliente hazlo ( sesion del navegador, objeto en memoria de la
aplicacion cliente,... ).


Atentamente, Enrique Catala Bañuls


"CHAR72" wrote:

Hola compañeros: tengo un problema para un triger cuando elimina datos.
El
tema es asi, al inicia mi app creo una tabla temporal de sesion e inserto
un
valor (la idea de variables globales) luego en triger usar ese valor, el
triger funciona perfecto excepto para las eliminaciones que no toma el
valor
de Usuario_ID, (toma -1) como si no encontrase la tabla temporal.
Agradeceria me indique porque para los insert o update si funciona y para
los delete no.

Saludos

Carlos

PD: es un SQL2000



CREATE TRIGGER Domicilios_Audit ON [dbo].[Domicilios]
FOR INSERT, UPDATE, DELETE
AS

DECLARE @Ins int,@Del int
DECLARE @Usuario_ID smallint
EXEC sp_GetUsuario_ID @Usuario_ID OUTPUT

SELECT @Ins=COUNT(*) FROM Inserted
SELECT @Del=COUNT(*) FROM Deleted

IF @Ins<>0 AND @Del=0
INSERT INTO
AUDITORIA_Domicilios(Estante,A_D,Columna,Fila,Usuario_ID,Tipo)
SELECT Estante,A_D,Columna,Fila,Usuario_ID=@Usuario_ID,Tipo='I' FROM
Inserted
ELSE
IF @Ins=0 AND @Del<>0
INSERT INTO
AUDITORIA_Domicilios(Estante,A_D,Columna,Fila,Usuario_ID,Tipo)
SELECT Estante,A_D,Columna,Fila,Usuario_ID=@Usuario_ID,Tipo='D' FROM
Deleted
ELSE
INSERT INTO
AUDITORIA_Domicilios(Estante,A_D,Columna,Fila,Usuario_ID,Tipo)
SELECT Estante,A_D,Columna,Fila,Usuario_ID=@Usuario_ID,Tipo='U' FROM
Inserted



CREATE PROCEDURE sp_GetUsuario_ID @Usuario_ID smallint OUTPUT AS

IF Object_id('tempdb.dbo.#Variables') IS NULL
SELECT @Usuario_ID=-1
ELSE
SELECT @Usuario_ID=Usuario_ID FROM #Variables
GO


-





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