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:

Mostrar la cita
#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ó:

Mostrar la cita
#3 Carlos
16/12/2005 - 16:33 | Informe spam
Lo resolví utilizando un cursor sobre la tabla inserted

"Carlos" escribió:

Mostrar la cita
#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:

Mostrar la cita
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
)

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


AMB

"Carlos" wrote:

Mostrar la cita
Ads by Google
Search Busqueda sugerida