Esto es un malentendido. El WHEN
cláusula de la definición del disparador espera un boolean
expresión y puede usar OR
operadores en ella. Esto debería funcionar (dado que todas las columnas realmente existen en la tabla account_details
). Yo mismo estoy usando disparadores similares:
CREATE TRIGGER trigger_update_account_details
AFTER UPDATE ON account_details
FOR EACH ROW
WHEN (OLD.email IS DISTINCT FROM NEW.email
OR OLD.username IS DISTINCT FROM NEW.username
OR OLD.password IS DISTINCT FROM NEW.password)
EXECUTE PROCEDURE notify_insert_account_details();
Evaluar la expresión tiene un costo mínimo, pero probablemente sea más confiable que la alternativa:
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
Porque, según la documentación:
Un disparador específico de columna (uno definido usando el UPDATE OF
column_name
sintaxis) se activará cuando cualquiera de sus columnas se enumere como objetivos en el UPDATE
SET
del comando lista. Es posible que el valor de una columna cambie incluso cuando el activador no se activa, porque los cambios realizados en el contenido de la fila por BEFORE UPDATE
los disparadores no se consideran. Por el contrario, un comando como UPDATE ... SET x = x ...
disparará un gatillo en la columna x, aunque el valor de la columna no haya cambiado.
ROW
la sintaxis de tipo es más corta para verificar en muchas columnas (haciendo lo mismo):
CREATE TRIGGER trigger_update_account_details
AFTER UPDATE ON account_details
FOR EACH ROW
WHEN ((OLD.email, OLD.username, OLD.password, ...)
IS DISTINCT FROM
(NEW.email, NEW.username, NEW.password, ...))
EXECUTE PROCEDURE notify_insert_account_details();
O bien, para comprobar todos columna de usuario visible en la fila:
...
WHEN (OLD IS DISTINCT FROM NEW)
...