これは誤解です。 WHEN
トリガー定義の句はboolean
を想定しています 式とあなたはOR
を使用することができます その中の演算子。これは正常に機能するはずです(すべての列が実際にテーブルaccount_details
に存在する場合 )。私は自分で同様のトリガーを使用しています:
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();
式の評価にはわずかなコストがかかりますが、これはおそらくより信頼性が高いです。 代替案より:
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
なぜなら、ドキュメントごとに:
列固有のトリガー(
UPDATE OF
を使用して定義されたトリガーcolumn_name
構文)は、その列のいずれかがUPDATE
のターゲットとしてリストされている場合に起動します コマンドのSET
リスト。BEFORE UPDATE
によって行の内容が変更されるため、トリガーが起動されていない場合でも、列の値が変更される可能性があります。 トリガーは考慮されません。逆に、UPDATE ... SET x = x ...
などのコマンド 列の値が変更されていなくても、列xでアトリガーを発射します。
ROW
タイプ構文は、多くの列をチェックするために短くなります(同じことを行います):
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();
または、すべてを確認します 行に表示されるユーザー列:
...
WHEN (OLD IS DISTINCT FROM NEW)
...