sql >> データベース >  >> RDS >> PostgreSQL

columnA、ColumnB、またはColumnCの更新時にトリガーを起動します

    これは誤解です。 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)
    ...
    


    1. SQLServerのgroupby列とともにコンマ区切り文字で集計結果を取得するSQLクエリ

    2. MySQLの複数列の外部キー?

    3. SQL Server ManagementStudioおよびTransactSQLでのGOの使用は何ですか?

    4. オンラインとオフラインバックアップ