¿Cómo registrar un activador si toda la fila sigue igual después de una actualización?

10

Por supuesto que podría hacerlo para cada columna comparando así:

if (old.column1 = new.column1 and old.column2 = new.column2...)

Pero sería difícil de mantener y codificar si agrego otra columna en el futuro, por ejemplo.

¿Hay alguna manera de verificar si todas las columnas permanecen iguales sin verificar cada columna individual manualmente?

Mateus Viccari
fuente
¿Se puede utilizar SALVO - techonthenet.com/postgresql/except.php
de Scott Hodgin
Lo siento, pero ¿cómo se utilizaría EXCEPTO en mi caso? Estoy tratando de comparar la fila anterior con los valores de la fila nueva, por lo que sé de EXCEPTO, se utiliza para comparar filas existentes de dos consultas, no en el contexto antiguo / nuevo de un desencadenante ...
Mateus Viccari
No estoy familiarizado con su dbms, ¿hay alguna forma de seleccionar nuevo. * Excepto seleccionar viejo. *? Si el recuento de filas = 0, no hay filas cambiadas
Scott Hodgin

Respuestas:

15

Simplemente puede comparar el oldy los newregistros mediante is not distinct fromel cual maneja correctamente los valores NULL (si se definen todas las columnas como NOT NULL puede simplemente usar =o <>)

if old is not distinct from new then 
   .... do something
end if;

Se puede hacer lo mismo para verificar si al menos una columna cambió:

if old is distinct from new then 
   .... do something
end if;
un caballo sin nombre
fuente
¿Cómo se manejan los NULL por estas condiciones?
ypercubeᵀᴹ
@ ypercubeᵀᴹ: buen punto. Actualicé mi respuesta.
a_horse_with_no_name
Thnx. Hice una comprobación rápida y parece que old=newmaneja el caso exactamente como old is not distinct from old. En otras palabras, no pude encontrar un caso donde old=newda un resultado NULO. ¡No esperaba eso!
ypercubeᵀᴹ
Creo que la diferencia estaría con, old <> newpero no estoy completamente seguro.
a_horse_with_no_name