TriggerErratico

Hola,
Tengo el siguiente trigger en un sqlserver 2000:
create trigger actualizafondo
ON dbo.E
after insert
AS
Begin
DECLARE @fecha DATETIME, @PARTE INT, @importe FLOAT, @iso CHAR(4)
SELECT @fecha = fecha_em FROM inserted
SELECT @PARTE = no_parte FROM inserted
SELECT @iso = origen FROM inserted
SELECT @importe = monto FROM inserted
UPDATE M
SET debe = debe + @importe
WHERE fecha = @fecha AND no_parte = @PARTE AND cod_iso = @iso
End
Este trigger debería ir sumando los montos de cada nuevo registro de la tabla E en la tabla M, el problema es que esta suma a veces no es la correcta, es decir, cuando la suma de los montos de E debería ser 100 en la tabla M aparece 88 y así de manera errática, estas diferencias no se dan todos los días, no se si es un problema del script, de la conexión (VPN) o de la version de sql(DEVELOPER).
¿Cómo puedo resolver este problema?, gracias por su ayuda

1 Respuesta

Respuesta
1
Recuerda que en la tabla inserted están todos los registros que se van a insertar, porque no pruebas totalizando tu columna, es decir @importe= sum(monto) from inserted, te recomiendo adicionalmente que corras una traza con el profiler y capturas el insert en la tabla E para que tu simules el trigger y veas con más luz el porque del problema.
Cualquier consulta adicional me avisas.
Brownsea,
Gracias por responder, con respecto a tu sugerencia de totalizar la columna me quedo una duda..., al totalizar la columna "monto" de la tabla inserted, ¿qué registros se incluirían en esa suma?, lo que pasa es que en mi aplicación trabajan varios clientes al mismo tiempo y mi duda es si no se sumarían los registros de los clientes que hubieran hecho la petición de manera simultanea.
Si no fuera mucha molestia, te pediría también que me orientes un poco con el tema de la traza y lo de capturar el insert de una tabla, te comento que es la primera vez que voy a trabajar con trazas y con tu sugerencia acabo de probar algo pero no puedo interpretar los resultados y creo que tampoco hice bien lo de capturar el insert.
Gracias de nuevo.
1. Recuerda que cada transacción corresponde a una conexión de tu aplicativo, por lo que cada transacción es independiente - ACID (Atomicidad, Consistencia, Aislamiento, Durabilidad), que quiere decir esto, que la información que se encuentre en la tabla inserted corresponde a los datos insertados por tu transacción en ese momento, si hubiera un usuario concurrente, el SQL bloquearía la tabla hasta que tu termines de realizar tu transacción.
2. Una vez que ejecutas el profiler, selecciona una nueva Traza, luego en la pestaña Propiedades-Selección de Eventos debes marcar Mostrar todas las columnas, luego hacer clic en el botón Filtro de Columnas y puedes filtrar la base de datos, el SPID en caso lo conocieras, tu login(LoginName) de tu computadora para asegurarte que la traza capture solo tus operaciones, ya en tu aplicativo, antes de realizar el evento que desencadena lo que estas analizando, limpias la traza(Icono de borrador) para que puedes ver solo lo que vas a ejecutar y puedas analizar tu data.
Me comentas como te va.
Brownsea,
Voy a probar tus sugerencias, te agradezco en el alma tu ayuda y tus aclaraciones, me pondré a investigar para aprender más sobre las trazas que es algo nuevo para mi.
Gracias de nuevo.
Yeso

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas