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

NEWにアクセスする挿入後のPostgresトリガー

    細かいマニュアルから:

    36.1。トリガー動作の概要
    [...]
    行レベルのトリガーの場合、入力データにはNEWも含まれます INSERTの行 およびUPDATE トリガー、および/またはOLD UPDATEの行 およびDELETE トリガー。ステートメントレベルのトリガーには、現在、ステートメントによって変更された個々の行を調べる方法がありません。

    そしてトリガー手順から:

    NEW
    データ型RECORD; INSERTの新しいデータベース行を保持する変数 / UPDATE 行レベルのトリガーでの操作。この変数はNULLです ステートメントレベルのトリガーおよびDELETEの場合 操作。

    行レベルのトリガーとステートメントレベルのトリガーについての説明に注意してください。

    ステートメントレベルのトリガーがあります:

    ...
    FOR EACH STATEMENT
    EXECUTE PROCEDURE f_log_datei();
    

    ステートメントレベルのトリガーはステートメントごとに1回トリガーされ、ステートメントは複数の行に適用できるため、影響を受ける行の概念 (これがNEW およびOLD について)単に適用されません。

    NEWを使用する場合 (またはOLD )トリガーで、影響を受ける行ごとにトリガーを実行する必要があります。つまり、行レベルのトリガーが必要です。

    CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
    ON dateien
    FOR EACH ROW
    EXECUTE PROCEDURE f_log_datei();
    

    FOR EACH STATEMENTを変更しました FOR EACH ROW

    トリガーも何かを返す必要があります:

    トリガー関数は、NULLのいずれかを返す必要があります または、トリガーが起動されたテーブルの構造を正確に持つレコード/行の値。
    [...]
    行レベルのトリガーの戻り値がAFTERで起動されました。 または、ステートメントレベルのトリガーがBEFOREで起動されました またはAFTER 常に無視されます。 nullの場合もあります。ただし、これらのタイプのトリガーはいずれも、エラーを発生させて操作全体を中止する可能性があります。

    したがって、RETURN NEW; またはRETURN NULL; あなたの引き金で。 AFTERトリガーがあるので、どのRETURNを使用してもかまいませんが、RETURN NEW;を使用します。 。




    1. PAUGデータベースデザイナカンファレンスに参加してください

    2. T-SQLを使用してリンクサーバーオプションを編集する方法

    3. Heroku Postgresエラー:PGError:エラー:リレーション組織が存在しません(ActiveRecord ::StatementInvalid)

    4. OracleのJSON_ARRAYAGG()関数