Trigger after insert no funciona desde INSERT INTO / SELECT

15/12/2005 - 20:43 por Carlos | Informe spam
Tengo un trigger en una tabla para actualizar el valor de un campo
(T.campo1). El valor que debe tomar este campo es la suma de otro campo de la
misma tabla (T.campo2) mas otro campo de otra tabla (Ta.campo3).

Lo primero que hago en el trigger es sacar en variables los campos que
necesito de la tabla INSERTED. Y después hago las operaciones y UPDATEs
necesarios.

Si inserto en la tabla registro a registro (uno a uno) , el trigger funciona
perfectamente.

Si inserto varios registros en bloque desde una select, el trigger solo me
funciona bien en el primer registro, el resto se queda con el campo T.campo1
a 0 (default value).

?

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
15/12/2005 - 20:50 | Informe spam
Carlos,

Por que no posteas el codigo del trigger?

Recuerda que los triggers son disparados por cada sentencia y no por cada
fila involucrada, por lo que debes tener en cuenta la existencia de multi
filas dentro del trigger.


AMB

"Carlos" wrote:

Tengo un trigger en una tabla para actualizar el valor de un campo
(T.campo1). El valor que debe tomar este campo es la suma de otro campo de la
misma tabla (T.campo2) mas otro campo de otra tabla (Ta.campo3).

Lo primero que hago en el trigger es sacar en variables los campos que
necesito de la tabla INSERTED. Y después hago las operaciones y UPDATEs
necesarios.

Si inserto en la tabla registro a registro (uno a uno) , el trigger funciona
perfectamente.

Si inserto varios registros en bloque desde una select, el trigger solo me
funciona bien en el primer registro, el resto se queda con el campo T.campo1
a 0 (default value).

?
Respuesta Responder a este mensaje
#2 Carlos
16/12/2005 - 12:54 | Informe spam
Gracias Alejandro.

Trataba de hacerlo como si el trigger se disparese por cada registro
insertado.

Ahora me funciona pero tengo un pequeño problema :
El trigger está en una tabla de movimiento de almacen (ALMACEN) con los
campos ARTICULO, CANTIDAD y STOCK, en otra tabla (ARTICULOS) tengo los
campos ARTICULO y STOCK .

Lo que quiero hacer es por cada registro que entre ALMACEN actualiza STOCK
en ARTICULOS y traiga el dato al registro ALMACEN.

El problema está cuando se realiza un INSERT/SELECT donde se repite el
código de ARTICULO.

trigger

UPDATE ARTICULO
SET CSTOCK= (ART.CSTOCK + I.CCANTIDAD)
FROM INSERTED I INNER JOIN ARTICULO ART
ON I.ARTICULO=ART.ARTICULO

UPDATE ALMACEN
SET CSTOCK=TA.CSTOCK
FROM INSERTED I
INNER JOIN ALMACEN ALM ON I.CODIGO=ALM.CODIGO
INNER JOIN ARTICULO TA
ON I.ARTICULO=TA.ARTICULO



Esto, evidentemente me lleva el mismo valor en STOCK a todas las filas que
se han insertado a la vez y que tienen el mismo código de artículo.

¿No se si desde el trigger habría alguna forma de actualizar bien el campo
STOCK por cada registro que se inserte en ALMACEN cuando se repite el código
de ARTICULO e un INSERT/SELECT?



"Alejandro Mesa" escribió:

Carlos,

Por que no posteas el codigo del trigger?

Recuerda que los triggers son disparados por cada sentencia y no por cada
fila involucrada, por lo que debes tener en cuenta la existencia de multi
filas dentro del trigger.


AMB

"Carlos" wrote:

> Tengo un trigger en una tabla para actualizar el valor de un campo
> (T.campo1). El valor que debe tomar este campo es la suma de otro campo de la
> misma tabla (T.campo2) mas otro campo de otra tabla (Ta.campo3).
>
> Lo primero que hago en el trigger es sacar en variables los campos que
> necesito de la tabla INSERTED. Y después hago las operaciones y UPDATEs
> necesarios.
>
> Si inserto en la tabla registro a registro (uno a uno) , el trigger funciona
> perfectamente.
>
> Si inserto varios registros en bloque desde una select, el trigger solo me
> funciona bien en el primer registro, el resto se queda con el campo T.campo1
> a 0 (default value).
>
> ?
Respuesta Responder a este mensaje
#3 Carlos
16/12/2005 - 16:33 | Informe spam
Lo resolví utilizando un cursor sobre la tabla inserted

"Carlos" escribió:

Gracias Alejandro.

Trataba de hacerlo como si el trigger se disparese por cada registro
insertado.

Ahora me funciona pero tengo un pequeño problema :
El trigger está en una tabla de movimiento de almacen (ALMACEN) con los
campos ARTICULO, CANTIDAD y STOCK, en otra tabla (ARTICULOS) tengo los
campos ARTICULO y STOCK .

Lo que quiero hacer es por cada registro que entre ALMACEN actualiza STOCK
en ARTICULOS y traiga el dato al registro ALMACEN.

El problema está cuando se realiza un INSERT/SELECT donde se repite el
código de ARTICULO.

trigger

UPDATE ARTICULO
SET CSTOCK= (ART.CSTOCK + I.CCANTIDAD)
FROM INSERTED I INNER JOIN ARTICULO ART
ON I.ARTICULO=ART.ARTICULO

UPDATE ALMACEN
SET CSTOCK=TA.CSTOCK
FROM INSERTED I
INNER JOIN ALMACEN ALM ON I.CODIGO=ALM.CODIGO
INNER JOIN ARTICULO TA
ON I.ARTICULO=TA.ARTICULO



Esto, evidentemente me lleva el mismo valor en STOCK a todas las filas que
se han insertado a la vez y que tienen el mismo código de artículo.

¿No se si desde el trigger habría alguna forma de actualizar bien el campo
STOCK por cada registro que se inserte en ALMACEN cuando se repite el código
de ARTICULO e un INSERT/SELECT?



"Alejandro Mesa" escribió:

> Carlos,
>
> Por que no posteas el codigo del trigger?
>
> Recuerda que los triggers son disparados por cada sentencia y no por cada
> fila involucrada, por lo que debes tener en cuenta la existencia de multi
> filas dentro del trigger.
>
>
> AMB
>
> "Carlos" wrote:
>
> > Tengo un trigger en una tabla para actualizar el valor de un campo
> > (T.campo1). El valor que debe tomar este campo es la suma de otro campo de la
> > misma tabla (T.campo2) mas otro campo de otra tabla (Ta.campo3).
> >
> > Lo primero que hago en el trigger es sacar en variables los campos que
> > necesito de la tabla INSERTED. Y después hago las operaciones y UPDATEs
> > necesarios.
> >
> > Si inserto en la tabla registro a registro (uno a uno) , el trigger funciona
> > perfectamente.
> >
> > Si inserto varios registros en bloque desde una select, el trigger solo me
> > funciona bien en el primer registro, el resto se queda con el campo T.campo1
> > a 0 (default value).
> >
> > ?
Respuesta Responder a este mensaje
#4 Alejandro Mesa
16/12/2005 - 17:51 | Informe spam
Carlos,

No te des por vencido, el uso de un cursor dentro de un trigger te va ha
traer problemas mas pronto de lo que te inmaginas.

Esta sentencia se puede hacer de la sgte manera:

> UPDATE ARTICULO
> SET CSTOCK= (ART.CSTOCK + I.CCANTIDAD)
> FROM INSERTED I INNER JOIN ARTICULO ART
> ON I.ARTICULO=ART.ARTICULO



UPDATE ARTICULO
SET CSTOCK= CSTOCK + (
select sum(I.CCANTIDAD)
FROM INSERTED I
where I.ARTICULO = ARTICULO.ARTICULO
)
where exists(
select * from inserted as I
where I.ARTICULO = ARTICULO.ARTICULO
)

> UPDATE ALMACEN
> SET CSTOCK=TA.CSTOCK
> FROM INSERTED I
> INNER JOIN ALMACEN ALM ON I.CODIGO=ALM.CODIGO
> INNER JOIN ARTICULO TA
> ON I.ARTICULO=TA.ARTICULO



Esta parte no la entiendo, me ayudaria mucho si posteas la estructura de las
tres tablas incluyendo PK and DRI constraints.


AMB

"Carlos" wrote:

Lo resolví utilizando un cursor sobre la tabla inserted

"Carlos" escribió:

> Gracias Alejandro.
>
> Trataba de hacerlo como si el trigger se disparese por cada registro
> insertado.
>
> Ahora me funciona pero tengo un pequeño problema :
> El trigger está en una tabla de movimiento de almacen (ALMACEN) con los
> campos ARTICULO, CANTIDAD y STOCK, en otra tabla (ARTICULOS) tengo los
> campos ARTICULO y STOCK .
>
> Lo que quiero hacer es por cada registro que entre ALMACEN actualiza STOCK
> en ARTICULOS y traiga el dato al registro ALMACEN.
>
> El problema está cuando se realiza un INSERT/SELECT donde se repite el
> código de ARTICULO.
>
> trigger
>
> UPDATE ARTICULO
> SET CSTOCK= (ART.CSTOCK + I.CCANTIDAD)
> FROM INSERTED I INNER JOIN ARTICULO ART
> ON I.ARTICULO=ART.ARTICULO
>
> UPDATE ALMACEN
> SET CSTOCK=TA.CSTOCK
> FROM INSERTED I
> INNER JOIN ALMACEN ALM ON I.CODIGO=ALM.CODIGO
> INNER JOIN ARTICULO TA
> ON I.ARTICULO=TA.ARTICULO
>
>
>
> Esto, evidentemente me lleva el mismo valor en STOCK a todas las filas que
> se han insertado a la vez y que tienen el mismo código de artículo.
>
> ¿No se si desde el trigger habría alguna forma de actualizar bien el campo
> STOCK por cada registro que se inserte en ALMACEN cuando se repite el código
> de ARTICULO e un INSERT/SELECT?
>
>
>
> "Alejandro Mesa" escribió:
>
> > Carlos,
> >
> > Por que no posteas el codigo del trigger?
> >
> > Recuerda que los triggers son disparados por cada sentencia y no por cada
> > fila involucrada, por lo que debes tener en cuenta la existencia de multi
> > filas dentro del trigger.
> >
> >
> > AMB
> >
> > "Carlos" wrote:
> >
> > > Tengo un trigger en una tabla para actualizar el valor de un campo
> > > (T.campo1). El valor que debe tomar este campo es la suma de otro campo de la
> > > misma tabla (T.campo2) mas otro campo de otra tabla (Ta.campo3).
> > >
> > > Lo primero que hago en el trigger es sacar en variables los campos que
> > > necesito de la tabla INSERTED. Y después hago las operaciones y UPDATEs
> > > necesarios.
> > >
> > > Si inserto en la tabla registro a registro (uno a uno) , el trigger funciona
> > > perfectamente.
> > >
> > > Si inserto varios registros en bloque desde una select, el trigger solo me
> > > funciona bien en el primer registro, el resto se queda con el campo T.campo1
> > > a 0 (default value).
> > >
> > > ?
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida