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

#6 Maxi
08/03/2009 - 22:25 | Informe spam
Revise la logica de negocios amigo, si es asi podria en lugar de aplicar
trigger usar foreirn key



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



"José Antonio Muñoz" escribió en el mensaje de
noticias:eaGk83#
¿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
#7 Jose Mariano Alvarez
09/03/2009 - 01:08 | Informe spam
Revise en el manual la integridad referencial y compare con los triggers
para ver cual le conviene.
Los stored procedures o procediemientos almacenados permiten escribir reglas
de negocio simples. Siempre es mejor escribirla alli que en triggers.


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:#9B2T6#
¿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
#8 José Antonio Muñoz
09/03/2009 - 08:43 | Informe spam
¿Me lo podrías explicar?

Te lo agredecería mucho, estoy un poco atascado,

José Antonio Muñoz

"Maxi" escribió en el mensaje de noticias
news:
Revise la logica de negocios amigo, si es asi podria en lugar de aplicar
trigger usar foreirn key



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



"José Antonio Muñoz" escribió en el mensaje de
noticias:eaGk83#
¿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







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