細かいマニュアルから:
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;
を使用します。 。