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

#6 Berta Gomez
05/04/2005 - 17:27 | Informe spam
Aclaro que puse la union porque puede darse que actualicen un contrato y le
cambien la obra y entonces deleted.obra puede ser distinto de inserted.obra.


"Berta Gomez" wrote in message
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
#7 Alejandro Mesa
05/04/2005 - 17:47 | Informe spam
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
#8 Maxi
05/04/2005 - 17:54 | Informe spam
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
#9 Alejandro Mesa
05/04/2005 - 18:05 | Informe spam
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
#10 Berta Gomez
05/04/2005 - 18:15 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida