To je nedorozumění. WHEN klauzule definice spouštěče očekává boolean výraz a můžete použít OR operátory v něm. To by mělo fungovat (vzhledem k tomu, že v tabulce account_details skutečně existují všechny sloupce ). Sám používám podobné spouštěče:
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();
Vyhodnocení výrazu stojí nepatrně, ale pravděpodobně je to spolehlivější než alternativa:
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
Protože podle dokumentace:
Spouštěč specifický pro sloupec (definovaný pomocí
UPDATE OFcolumn_namesyntaxe) se spustí, když je některý z jeho sloupců uveden jako cíle vUPDATEpříkazuSETseznam. Je možné, že se hodnota sloupce změní, i když se pravidlo nespustí, protože změny provedené v obsahu řádkuBEFORE UPDATEspouštěče se neberou v úvahu. Naopak příkaz jakoUPDATE ... SET x = x ...spustí spouštěč ve sloupci x, i když se hodnota sloupce nezměnila.
ROW syntaxe typu je kratší pro kontrolu mnoha sloupců (totéž):
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();
Nebo pro kontrolu každého viditelný uživatelský sloupec v řádku:
...
WHEN (OLD IS DISTINCT FROM NEW)
...