Se puede actualizar (UPDATE) una fila de dos maneras distintas:

  • A través de un UPDATE específico a esa fila
  • A través de un ON UPDATE CASCADE que proviene de una restricción Foreign Key

Ejemplo 1. UPDATE específico

UPDATE
   PEDIDOSDET
SET
   PED_CODPRD = '1223334444'
WHERE
   PED_CODPRD = '1111111111'

Aquí, en la tabla PEDIDOSDET (detalles de pedidos) se cambió el código del producto, reemplazándose a todos los ‘1111111111’ por ‘1223334444’

Ejemplo 2. ON UPDATE CASCADE

UPDATE
   PRODUCTOS
SET
   PRD_CODIGO = '1223334444'
WHERE
   PRD_CODIGO = '1111111111'

Si la tabla PRODUCTOS está relacionada a través de una Foreign Key ON UPDATE CASCADE con la tabla PEDIDOSDET por medio de la columna PRD_CODIGO entonces todos los códigos de los productos de la tabla PEDIDOSDET que eran ‘1111111111’ ahora se cambiaron por ‘1223334444’

¿Cómo se puede distinguir si la modificación se debió a un UPDATE normal o a un UPDATE ON CASCADE?

En general, no vas a necesitar esa información, pero supongamos que por algún motivo sí necesitas conocerla. Entonces puedes hacer lo siguiente:

  1. Le agregas una columna numérica a tu tabla (en este ejemplo a la tabla PEDIDOSDET)
  2. Si es un UPDATE normal entonces incrementas en uno el valor de esa columna
  3. Ahora, en tu trigger de actualización puedes comparar si el nuevo valor es igual al viejo valor
  4. Si son iguales, se trata de un UPDATE ON CASCADE, si son distintos se trata de un UPDATE normal
  5. Le asignas a la nueva columna el valor de la vieja columna

Ejemplo 3. Distinguiendo el tipo de UPDATE

A la tabla PEDIDOSDET se le agregó la columna numérica PED_CANMOD (cantidad de modificaciones)

En el caso de un UPDATE normal se escribiría:

UPDATE
   PEDIDOSDET
SET
   PED_CODPRD = '1223334444',
   PED_CANMOD = PED_CANMOD + 1
WHERE
   PED_CODPRD = '1111111111'

En el trigger “Before Update” se escribiría:

IF (NEW.PED_CANMOD <> OLD.PED_CANMOD) THEN BEGIN     /* UPDATE normal */
   ....
ELSE     /* UPDATE ON CASCADE */
   ...
END

NEW.PED_CANMOD = OLD.PED_CANMOD

Artículos relacionados:

https://firebird21.wordpress.com/2013/05/26/entendiendo-a-las-foreign-keys/

https://firebird21.wordpress.com/2013/03/17/entendiendo-a-los-triggers/

Anuncios