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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 Jose Mariano Alvarez
07/03/2009 - 17:58 | Informe spam
Creo que tu problema es que estas mezclando logica en la base de datos con
logica en la aplicacion y no son consistentes.
Parece que no tienes constraints. Yo prefiero tenerlos y en lugar de esos
triguers, stored procedures y con toda la logica de actualizacion en ese
lugar. Es mas simple, es visible y mas recomendable.
Si aun sigues con los triggers, deberas probablemente crear tres triggers
compatibles con tu aplicacion.


Saludos


Ing. Jose Mariano Alvarez
http://blog.josemarianoalvarez.com/
Microsoft MVP
SQLTotal Consulting

(Cambia los ceros por O y saca lo que sobra)

Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase. Por
favor tratar de indicar la versión de SQL y Service Pack. La inclusión de
(CREATE, INSERTS, etc.) para poder reproducir el problema también ayuda.










"José Antonio Muñoz" wrote in message
news:
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
Respuesta Responder a este mensaje
#3 José Antonio Muñoz
08/03/2009 - 14:01 | Informe spam
¿Y si en la tabla de Hospitalizaciones se borran registros?, entonces ¿No se
borran en la tabla de enfermedades? ¡Eso no sería correcto! Un paciente no
puede tener una enfermedad que proveniente de una hospitalización, en un
momento dado, por algún motivo, se eliminó uno de los registros de
hospitalizaciones.

¿Como se borrarían estos registros de forma automática?

saludos,
José Antonio Muñoz.

"Maxi" escribió en el mensaje
news:
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



Respuesta Responder a este mensaje
#4 José Antonio Muñoz
08/03/2009 - 14:05 | Informe spam
¿qué significa tener constraints y aplicarlos con stores procedures? ¿que
tiene que ver con los triggers?

Cuando dices que debería crear tres triggers ¿a qué te regieres? ¿uno para
cada operación UPDATE otro para DELETE y otro para INSERT?

saludos,
José Antonio Muñoz

"Jose Mariano Alvarez"
escribió en el
mensaje news:
Creo que tu problema es que estas mezclando logica en la base de datos con
logica en la aplicacion y no son consistentes.
Parece que no tienes constraints. Yo prefiero tenerlos y en lugar de esos
triguers, stored procedures y con toda la logica de actualizacion en ese
lugar. Es mas simple, es visible y mas recomendable.
Si aun sigues con los triggers, deberas probablemente crear tres triggers
compatibles con tu aplicacion.


Saludos


Ing. Jose Mariano Alvarez
http://blog.josemarianoalvarez.com/
Microsoft MVP
SQLTotal Consulting

(Cambia los ceros por O y saca lo que sobra)

Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase.
Por favor tratar de indicar la versión de SQL y Service Pack. La inclusión
de (CREATE, INSERTS, etc.) para poder reproducir el problema también
ayuda.










"José Antonio Muñoz" wrote in message
news:
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



Respuesta Responder a este mensaje
#5 José Antonio Muñoz
08/03/2009 - 14:16 | Informe spam
El problema creo que está en la operación DELETE cuando intenta eliminar
registros que no existen en la tabla de enfermedades. No sé si un DELETE
cuando se ejecuta para una determinada condición WHERE y no existen
registros para esa condición, el trigger correspondiente a la tabla donde se
pretende borrar también se ejecuta y provoca el error. Si efectuo la misma
operación de actualización en el Management studio no se producen errores
pero me salen informaciones como:

se han actualizado 0 registros.
se han actualizado 0 registros.
se han actualizado 0 registros.

Y asi varias veces, entiendo que por cada operación de actualización,
borrado o inserción de cada trigger.

¿Podría poner dentro del trigger un IF para comprobar si existen registros
que cumplan la condición del WHERE del delete y si se cumple ejecutar el
DELETE con el correspondiete WHERE? ¿o esto que estoy diciendo es un
absurdo?

Saludos,
José Antonio Muñoz

"Maxi" escribió en el mensaje
news:
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



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