Ayuda con un trigger please

05/04/2005 - 15:39 por Berta Gomez | Informe spam
Un tabla OBRAS tiene un estatus (0-activa 1-rescindida). Ese campo debo
actualizarlo cuando se registra un contrato de rescicion en la tabla
CONTRATOS, en este caso cuando el campo CONTRATOS.tipo = 5 (flag de
rescision). El asunto es que CONTRATOS tiene otro campo estatus (0-activo
1-inactivo). Si el contrato se inactiva aun su tipo sea 5 (rescision), la
obra debe quedar como que no esta rescindida. El contrato posee un campo
Obra para referenciar la obra a la cual se refiere.

He hecho este trigger despues de muuuuucho pensar, para (insert, update y
delete ) en la tabla CONTRATOS y me gustaria me dieran una opinion pues no
estoy muy clara porque me funciona para rescindir la obra pero si se marca
como inactivo el contrato de rescision no me funciona.

for insert,update, delete
..
..
UPDATE OBRAS
SET OBRAS.STAT=1
from OBRAS inner join (select obra from INSERTED union select obra from
DELETED) contratosmodificados on OBRAS.obra=contratosmodificados.obra
WHERE EXISTS( select contrato from CONTRATOS where CONTRATOS.obra=OBRAS.obra
and CONTRATOS.tipo=3 and CONTRATOS.stat=1)

Preguntas similare

Leer las respuestas

#11 Berta Gomez
05/04/2005 - 18:22 | Informe spam
Ok pero pienso que como tengo SELECT OBRA (solo la columna obra) en la
union, si esta no ha cambiado en el update pues solamente aparecera una sola
vez en el conjunto resultante porque no tengo UNION ALL. No estoy
totalmente segura pero me imagino que es asi porque inserted y deleted el
trigger las trata igual que a cualesquiera otras tablas.


Gracias

Berta





"Maxi" wrote in message
news:
Pero a ver, en deleted estaran los registros a borrar y en inserted a
insertar, que pasa cuando hay un UPDATE? se llenan ambas tablas


Salu2
Maxi


"Berta Gomez" escribió en el mensaje
news:
>> Hola, lo que no entiendo es porque haces un UNION con la Inserted -
> Deleted?
>> ahi puedes tener registros repetidos :(
>
> Pensaba que no se repetian si no ponia UNION ALL. No es asi ?
>
>
>


Respuesta Responder a este mensaje
#12 Berta Gomez
05/04/2005 - 18:28 | Informe spam
Como te dije en otro mensaje, pienso que no se repiten porque el select de
la union solo tiene la columna OBRA. Pero de todos modos me intriga
probarlo. Como podria dentro del trigger saber si esta trabajando
correctamente en cuanto a que no se repite ?


"Alejandro Mesa" wrote in message
news:
Maxi,

Estoy de acuerdo contigo, en caso de actualizacion ambas tablas tendran
diferentes filas y el resultado sera igual que usar UNION ALL, y por lo


tanto
se actualizara dos veces la misma fila en la tabla [obras], incluso si la
columna [stat] no cambio en la tabla [contratos].


AMB

"Maxi" wrote:

> Pero a ver, en deleted estaran los registros a borrar y en inserted a
> insertar, que pasa cuando hay un UPDATE? se llenan ambas tablas
>
>
> Salu2
> Maxi
>
>
> "Berta Gomez" escribió en el mensaje
> news:
> >> Hola, lo que no entiendo es porque haces un UNION con la Inserted -
> > Deleted?
> >> ahi puedes tener registros repetidos :(
> >
> > Pensaba que no se repetian si no ponia UNION ALL. No es asi ?
> >
> >
> >
>
>
>
Respuesta Responder a este mensaje
#13 Alejandro Mesa
05/04/2005 - 18:41 | Informe spam
Berta,

Bueno solo dije que lo estaba probando y funciona :). Ya que se pueda
optimizar es otra cosa. La idea es aprender.



Esa es la idea, aprender y ayudar. No tomes a mal ningun comentario por
parte de quienes participamos en el grupo.

A ver, para detectar si la columna stat de la tabla contratos ha cambiado
podria usar un IF UPDATE(stat). Con eso seria suficiente , no ?



Eso no es suficiente, IF UPDATE(stat) solo dice si la columna [stat] formo
parte de la lista de columnas referenciadas en la sentencia update que
disparo el trigger. Debes comparar los valores de la columna [stat] en ambas
tablas (inserted y deleted), recurda tener en cuenta los valores NULL si es
que eston son permitidas en esta columna pues NULL != 1 es NULL y no se
detectara.

Lo de la UNION me imagino (no lo he probado) que como tiene explicitamente
el campo OBRA en cada select y no tiene la clausula ALL, solo me devolvera
un solo registro si la obra no ha cambiado (caso de un update). Ahora bien,
si la columna OBRA ha cambiado pues es correcto que me devuelva los dos
registros (la vieja obra y la nueva) debido a que ambos deben ser
actualizados. Si no es ese el comportamiento favor corregirme.



Tienes toda la razon. No me fije que en el select estava solo una columna,
asi que la seleccion no dara filas duplicadas.

(select obra from inserted union select obra from deleted)

Opss!!


AMB

"Berta Gomez" wrote:

Hola Alejandro,

Bueno solo dije que lo estaba probando y funciona :). Ya que se pueda
optimizar es otra cosa. La idea es aprender.

A ver, para detectar si la columna stat de la tabla contratos ha cambiado
podria usar un IF UPDATE(stat). Con eso seria suficiente , no ?

Lo de la UNION me imagino (no lo he probado) que como tiene explicitamente
el campo OBRA en cada select y no tiene la clausula ALL, solo me devolvera
un solo registro si la obra no ha cambiado (caso de un update). Ahora bien,
si la columna OBRA ha cambiado pues es correcto que me devuelva los dos
registros (la vieja obra y la nueva) debido a que ambos deben ser
actualizados. Si no es ese el comportamiento favor corregirme.


Saludos y gracias por la ayuda que todos me dan

Berta


"Alejandro Mesa" wrote in message
news:
> Berta,
>
> Un comentario. La sentencia posteada, asi como la solucion, actualizaran
la
> columna [stat] de la tabla [obras] aunque la columna [stat] de la tabla
> [contratos] no haya cambiado, ademas la UNION traera dos registros si
alguna
> columna cambio y por tanto actualizaras una fila en la tabla obras dos
veces
> para un mismo contrato. Crees que eso es practico?
>
>
> AMB
>
>
> "Berta Gomez" wrote:
>
> >
> > Gracias Ricardo
> >
> > Lo he estado probando y ha estado funcionando bien. No tenia ni idea
que se
> > podia armar un select en un case.
> >
> > Berta
> >
> >
> > "Ricardo Passians" wrote in message
> > news:
> > > Hola Berta:
> > >
> > > A ver si entiendo. Arriba dice que CONTRATOS.tipo = 5 para cuando es
un
> > > contrato de rescision pero en el where pusiste tipo=3. Imagino que
fue un
> > > error.
> > >
> > > Prueba quitando el where y poniendo un Case When Then End, a ver si te
> > > funciona para todos los casos:
> > > (ojo:debes chequear si hay algun error de sintaxis)
> > >
> > > UPDATE OBRAS SET OBRAS.STAT> > > > case when (EXISTS(select contrato from CONTRATOS where
> > > CONTRATOS.obra=OBRAS.obra and CONTRATOS.tipo=5 and CONTRATOS.stat=1))
> > > then 1 else 0 end
> > > from OBRAS inner join (select obra from INSERTED union select obra
from
> > > DELETED) modificados on OBRAS.obra=modificados.obra
> > >
> > >
> > >
> > > "Berta Gomez" wrote in message
> > > news:%
> > > > Un tabla OBRAS tiene un estatus (0-activa 1-rescindida). Ese
campo
> > debo
> > > > actualizarlo cuando se registra un contrato de rescicion en la tabla
> > > > CONTRATOS, en este caso cuando el campo CONTRATOS.tipo = 5 (flag de
> > > > rescision). El asunto es que CONTRATOS tiene otro campo estatus
> > (0-activo
> > > > 1-inactivo). Si el contrato se inactiva aun su tipo sea 5
(rescision),
> > la
> > > > obra debe quedar como que no esta rescindida. El contrato posee un
campo
> > > > Obra para referenciar la obra a la cual se refiere.
> > > >
> > > > He hecho este trigger despues de muuuuucho pensar, para (insert,
update
> > y
> > > > delete ) en la tabla CONTRATOS y me gustaria me dieran una opinion
pues
> > no
> > > > estoy muy clara porque me funciona para rescindir la obra pero si se
> > marca
> > > > como inactivo el contrato de rescision no me funciona.
> > > >
> > > > for insert,update, delete
> > > > ..
> > > > ..
> > > > UPDATE OBRAS
> > > > SET OBRAS.STAT=1
> > > > from OBRAS inner join (select obra from INSERTED union select obra
from
> > > > DELETED) contratosmodificados on
OBRAS.obra=contratosmodificados.obra
> > > > WHERE EXISTS( select contrato from CONTRATOS where
> > > CONTRATOS.obra=OBRAS.obra
> > > > and CONTRATOS.tipo=3 and CONTRATOS.stat=1)
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
> >



Respuesta Responder a este mensaje
#14 Ricardo Passians
05/04/2005 - 19:00 | Informe spam
Hola,

En cuanto a la union solo devolvera mas de un registro cuando efectivamente
la columna OBRA ha sido actualizada. En caso contrario, tendria que haber un
Union all para que se repitan. Me luce por cierto una idea muy ingeniosa
de Berta hacer esa union.

Sobre lo del campo stat de la tabla contratos pienso que depende del costo
que tenga estarlo actualizando cada vez. Puede que eso no sea muy costoso,
habria que ver el caso particular y la frecuencia. Me imagino ademas que
tambien podria cambiar la columna tipo en cuyo caso deberia actualizarse
igual, haya o no cambiado el campo stat. Por eso habria que ver.

De todas maneras yo tambien considero que es preferible tenerlo separado en
varios trigger para insert, update, delete pues asi todo es mas sencillo de
comprender y mantener. Lo puse asi, porque Berta ya lo tenia todo en un
solo trigger.


Saludos


"Alejandro Mesa" wrote in message
news:
Berta,

Un comentario. La sentencia posteada, asi como la solucion, actualizaran


la
columna [stat] de la tabla [obras] aunque la columna [stat] de la tabla
[contratos] no haya cambiado, ademas la UNION traera dos registros si


alguna
columna cambio y por tanto actualizaras una fila en la tabla obras dos


veces
para un mismo contrato. Crees que eso es practico?


AMB


"Berta Gomez" wrote:

>
> Gracias Ricardo
>
> Lo he estado probando y ha estado funcionando bien. No tenia ni idea


que se
> podia armar un select en un case.
>
> Berta
>
>
> "Ricardo Passians" wrote in message
> news:
> > Hola Berta:
> >
> > A ver si entiendo. Arriba dice que CONTRATOS.tipo = 5 para cuando es


un
> > contrato de rescision pero en el where pusiste tipo=3. Imagino que


fue un
> > error.
> >
> > Prueba quitando el where y poniendo un Case When Then End, a ver si te
> > funciona para todos los casos:
> > (ojo:debes chequear si hay algun error de sintaxis)
> >
> > UPDATE OBRAS SET OBRAS.STAT> > > case when (EXISTS(select contrato from CONTRATOS where
> > CONTRATOS.obra=OBRAS.obra and CONTRATOS.tipo=5 and CONTRATOS.stat=1))
> > then 1 else 0 end
> > from OBRAS inner join (select obra from INSERTED union select obra


from
> > DELETED) modificados on OBRAS.obra=modificados.obra
> >
> >
> >
> > "Berta Gomez" wrote in message
> > news:%
> > > Un tabla OBRAS tiene un estatus (0-activa 1-rescindida). Ese


campo
> debo
> > > actualizarlo cuando se registra un contrato de rescicion en la tabla
> > > CONTRATOS, en este caso cuando el campo CONTRATOS.tipo = 5 (flag de
> > > rescision). El asunto es que CONTRATOS tiene otro campo estatus
> (0-activo
> > > 1-inactivo). Si el contrato se inactiva aun su tipo sea 5


(rescision),
> la
> > > obra debe quedar como que no esta rescindida. El contrato posee un


campo
> > > Obra para referenciar la obra a la cual se refiere.
> > >
> > > He hecho este trigger despues de muuuuucho pensar, para (insert,


update
> y
> > > delete ) en la tabla CONTRATOS y me gustaria me dieran una opinion


pues
> no
> > > estoy muy clara porque me funciona para rescindir la obra pero si se
> marca
> > > como inactivo el contrato de rescision no me funciona.
> > >
> > > for insert,update, delete
> > > ..
> > > ..
> > > UPDATE OBRAS
> > > SET OBRAS.STAT=1
> > > from OBRAS inner join (select obra from INSERTED union select obra


from
> > > DELETED) contratosmodificados on


OBRAS.obra=contratosmodificados.obra
> > > WHERE EXISTS( select contrato from CONTRATOS where
> > CONTRATOS.obra=OBRAS.obra
> > > and CONTRATOS.tipo=3 and CONTRATOS.stat=1)
> > >
> > >
> > >
> > >
> >
> >
>
>
>
Respuesta Responder a este mensaje
#15 Ricardo Passians
05/04/2005 - 19:03 | Informe spam
Estas en lo cierto, como diria chaparron :)

Sobre como probarlo, puede haber otras maneras pero una sencilla es poner
temporalmente un contador de actualizaciones en la tabla obras y poner un
trigger de update a esa tabla que le incremente en uno ese contador.
Cuando hayas hecho la prueba puedes borrar tando el contador como el trigger
for update de la tabla obras.

Saludos.


"Berta Gomez" wrote in message
news:
Como te dije en otro mensaje, pienso que no se repiten porque el select de
la union solo tiene la columna OBRA. Pero de todos modos me intriga
probarlo. Como podria dentro del trigger saber si esta trabajando
correctamente en cuanto a que no se repite ?


"Alejandro Mesa" wrote in


message
news:
> Maxi,
>
> Estoy de acuerdo contigo, en caso de actualizacion ambas tablas tendran
> diferentes filas y el resultado sera igual que usar UNION ALL, y por lo
tanto
> se actualizara dos veces la misma fila en la tabla [obras], incluso si


la
> columna [stat] no cambio en la tabla [contratos].
>
>
> AMB
>
> "Maxi" wrote:
>
> > Pero a ver, en deleted estaran los registros a borrar y en inserted a
> > insertar, que pasa cuando hay un UPDATE? se llenan ambas tablas
> >
> >
> > Salu2
> > Maxi
> >
> >
> > "Berta Gomez" escribió en el mensaje
> > news:
> > >> Hola, lo que no entiendo es porque haces un UNION con la Inserted -
> > > Deleted?
> > >> ahi puedes tener registros repetidos :(
> > >
> > > Pensaba que no se repetian si no ponia UNION ALL. No es asi ?
> > >
> > >
> > >
> >
> >
> >


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