TRIGGERS

07/03/2009 - 14:38 por José Antonio Muñoz | Informe spam
Hola al grupo,

Tengo el siguiente trigger

CREATE TRIGGER Act_Hospitalizaciones ON Hospitalizaciones AFTER
INSERT,DELETE,UPDATE
AS
BEGIN
DELETE Enfermedades WHERE Desde_Hospital In (SELECT Codigo FROM Deleted)
INSERT Enfermedades SELECT Paciente, Causa, Fecha, Codigo FROM Inserted
END

El cometido del Trigger es que necesito actualizar la tabla enfermedades
automáticamente a partir de la tabla de Hospitalizaciones, de manera que
cada vez que se inserta, modifica o elimina un registro de la tabla de
hospitalizaciones se tiene que agregar, modificar o eliminar el registro
correspondiente en la tabla de enfermedades. El campo Desde_Hospital de
Enfermedades tiene un valor que corresponde con el campo codigo de la tabla
de Hospitalizaciones.

Parece que funciona bien pero, en mi proyecto realizado, me produce errores
cuando intento actualizar la tabla de hospitalizaciones. Parece ser que
cuando no exiten registros correspondientes en la tabla de hospitalizaciones
para eliminar algo provoca un error que solo aparece desde la aplicación que
estoy realizando. El error dice: "No se encuentra la fila para su
actualización. Algunos valores han cambiado desde que se leyó los datos por
última vez".

Hay que tener en cuenta que la tabla enfermedades también tiene un TRIGGER
que actualiza otra tabla (Pacientes) que actualiza un determinado campo.

CREATE TRIGGER Act_Enfermedades ON Enfermedades AFTER INSERT, UPDATE
AS
BEGIN
UPDATE Pacientes SET Fecha_Enfermedad=Fecha FROM Pacientes INNER JOIN
(SELECT Paciente, Fecha FROM Deleted) As x ON Pacientes.Codigo=x.Paciente
END

No sé si estoy haciendo bien los triggers, ¿alguien me sugiere hacerlo de
otra manera? ¿Como puedo saber dentro de un trigger cuando entra añadiendo,
modificando o eliminado datos de la tabla en cuestión?

Gracias por adelantado y saludos al grupo,

José Antonio Muñoz
 

Leer las respuestas

#1 Maxi
07/03/2009 - 15:20 | Informe spam
Hola, yo no borraria y haria un update, sino que haria dos operaciones

1) Insert para los que no estan
2) Update para los que estan

Al borrar el registro tienes que tener muchas cosas en consideracion y
quizas si tu aplicacion estaba levantando el registro y se lo borraste es
normal que de un error.





Maxi Accotto
Microsoft MVP en SQL Server
Consultor en SQL Total Consulting



"José Antonio Muñoz" escribió en el mensaje de
noticias:
Hola al grupo,

Tengo el siguiente trigger

CREATE TRIGGER Act_Hospitalizaciones ON Hospitalizaciones AFTER
INSERT,DELETE,UPDATE
AS
BEGIN
DELETE Enfermedades WHERE Desde_Hospital In (SELECT Codigo FROM Deleted)
INSERT Enfermedades SELECT Paciente, Causa, Fecha, Codigo FROM Inserted
END

El cometido del Trigger es que necesito actualizar la tabla enfermedades
automáticamente a partir de la tabla de Hospitalizaciones, de manera que
cada vez que se inserta, modifica o elimina un registro de la tabla de
hospitalizaciones se tiene que agregar, modificar o eliminar el registro
correspondiente en la tabla de enfermedades. El campo Desde_Hospital de
Enfermedades tiene un valor que corresponde con el campo codigo de la
tabla de Hospitalizaciones.

Parece que funciona bien pero, en mi proyecto realizado, me produce
errores cuando intento actualizar la tabla de hospitalizaciones. Parece
ser que cuando no exiten registros correspondientes en la tabla de
hospitalizaciones para eliminar algo provoca un error que solo aparece
desde la aplicación que estoy realizando. El error dice: "No se encuentra
la fila para su actualización. Algunos valores han cambiado desde que se
leyó los datos por última vez".

Hay que tener en cuenta que la tabla enfermedades también tiene un TRIGGER
que actualiza otra tabla (Pacientes) que actualiza un determinado campo.

CREATE TRIGGER Act_Enfermedades ON Enfermedades AFTER INSERT, UPDATE
AS
BEGIN
UPDATE Pacientes SET Fecha_Enfermedad=Fecha FROM Pacientes INNER JOIN
(SELECT Paciente, Fecha FROM Deleted) As x ON Pacientes.Codigo=x.Paciente
END

No sé si estoy haciendo bien los triggers, ¿alguien me sugiere hacerlo de
otra manera? ¿Como puedo saber dentro de un trigger cuando entra
añadiendo, modificando o eliminado datos de la tabla en cuestión?

Gracias por adelantado y saludos al grupo,

José Antonio Muñoz

Preguntas similares