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 OF
column_name
syntaxe) se spustí, když je některý z jeho sloupců uveden jako cíle vUPDATE
příkazuSET
seznam. Je možné, že se hodnota sloupce změní, i když se pravidlo nespustí, protože změny provedené v obsahu řádkuBEFORE UPDATE
spouš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)
...