Ayuda con un Trigger

17/06/2004 - 19:06 por Leonardo Azpurua | Informe spam
Hola.

El trigger es este:

ALTER TRIGGER TramosReservas_ActualizarRelacionados
ON dbo.TramosReservas
FOR INSERT, UPDATE, DELETE
AS
DECLARE @nRecords int
UPDATE Vuelos SET Ocupacion = Ocupacion - Supr.qPax FROM DELETED
Supr WHERE Vuelos.id = Supr.idVuelo AND supr.Activo = 1
UPDATE CuposVuelo SET Asignados = Asignados - Supr.qPax FROM Deleted
SUPR WHERE CuposVuelo.idVuelo = Supr.idVuelo AND CuposVuelo.Clase Supr.Clase AND CuposVuelo.Tarifa = Supr.Tarifa AND Supr.Activo = 1

UPDATE Vuelos SET Ocupacion = Ocupacion + ins.qPax FROM INSERTED ins
WHERE Vuelos.id = ins.idVuelo AND Vuelos.Ocupacion + ins.qPax <Vuelos.Capacidad AND ins.Activo = 1
If @@RowCount = 0
BEGIN
RAISERROR ('Cupo insuficiente (1)', 1, 1)
END
UPDATE CuposVuelo SET Asignados = Asignados + ins.qPax FROM INSERTED ins
WHERE CuposVuelo.idVuelo = ins.idVuelo AND CuposVuelo.Clase = ins.Clase AND
CuposVuelo.Tarifa = ins.Tarifa AND CuposVuelo.Asignados + ins.qPax <CuposVuelo.Cupo AND ins.Activo = 1
If @@RowCount = 0
BEGIN
RAISERROR ('Cupo insuficiente (2)', 1, 1)
END

Funciona cuando se elimina un registro individualmente. Pero si se elimina
la reservación, provocando la eliminación en cascada de los TramosReserva
relacionados, da un error con la descripción siguiente:

"KeyColumn is insufficient or incorrect. Too many rows were affected by
update"

(si lo ejecuto desde el Explorador de Servidores de VStudio 2003), funciona
(es decir, produce el efecto esperado) desde el analizador de cosnultas,
pero reporta dos errores de insuficiencia de cupo (es decir, el error que se
produce al intentar insertar, que no deberia pasar porque INSERTED debe ser
una tabla vacía cuando se elimina).

¿Alguien puede ayudarme a entender qué pasa aquí?

Salud!

Leonardo
[MVP Visual Basic]
Claro ejemplo de que saber de una cosa no implica saber de otras :-))
[Maicrosoft LVP - MOP Certified]
leonardo<arroba>mvps<punto>org
 

Leer las respuestas

#1 Fernando España
17/06/2004 - 19:46 | Informe spam
despues de el raiserror, reviertes el manejo de datos, usas un rollback o
algo asi y le das return para que no continue ejecutandose el codigo si no
regrese a tu aplicacion.



Fernando España
Gerente Informatica
Alta Tecnologia en Informatica S.A.
www.atisa.com.gt
7a. calle 4-34 Zona 10
Guatemala Centro America
PBX: (502) 3620005

Email:

****************************************

"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:%
Hola.

El trigger es este:

ALTER TRIGGER TramosReservas_ActualizarRelacionados
ON dbo.TramosReservas
FOR INSERT, UPDATE, DELETE
AS
DECLARE @nRecords int
UPDATE Vuelos SET Ocupacion = Ocupacion - Supr.qPax FROM DELETED
Supr WHERE Vuelos.id = Supr.idVuelo AND supr.Activo = 1
UPDATE CuposVuelo SET Asignados = Asignados - Supr.qPax FROM


Deleted
SUPR WHERE CuposVuelo.idVuelo = Supr.idVuelo AND CuposVuelo.Clase > Supr.Clase AND CuposVuelo.Tarifa = Supr.Tarifa AND Supr.Activo = 1

UPDATE Vuelos SET Ocupacion = Ocupacion + ins.qPax FROM INSERTED ins
WHERE Vuelos.id = ins.idVuelo AND Vuelos.Ocupacion + ins.qPax <> Vuelos.Capacidad AND ins.Activo = 1
If @@RowCount = 0
BEGIN
RAISERROR ('Cupo insuficiente (1)', 1, 1)
END
UPDATE CuposVuelo SET Asignados = Asignados + ins.qPax FROM INSERTED


ins
WHERE CuposVuelo.idVuelo = ins.idVuelo AND CuposVuelo.Clase = ins.Clase


AND
CuposVuelo.Tarifa = ins.Tarifa AND CuposVuelo.Asignados + ins.qPax <> CuposVuelo.Cupo AND ins.Activo = 1
If @@RowCount = 0
BEGIN
RAISERROR ('Cupo insuficiente (2)', 1, 1)
END

Funciona cuando se elimina un registro individualmente. Pero si se elimina
la reservación, provocando la eliminación en cascada de los TramosReserva
relacionados, da un error con la descripción siguiente:

"KeyColumn is insufficient or incorrect. Too many rows were affected by
update"

(si lo ejecuto desde el Explorador de Servidores de VStudio 2003),


funciona
(es decir, produce el efecto esperado) desde el analizador de cosnultas,
pero reporta dos errores de insuficiencia de cupo (es decir, el error que


se
produce al intentar insertar, que no deberia pasar porque INSERTED debe


ser
una tabla vacía cuando se elimina).

¿Alguien puede ayudarme a entender qué pasa aquí?

Salud!

Leonardo
[MVP Visual Basic]
Claro ejemplo de que saber de una cosa no implica saber de otras :-))
[Maicrosoft LVP - MOP Certified]
leonardo<arroba>mvps<punto>org


Preguntas similares