sql >> Base de Datos >  >> RDS >> PostgreSQL

Activador de disparo en la actualización de la columna A o Columna B o Columna C

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)
...