細かいマニュアルから:
36.1。トリガー動作の概要
[...]
行レベルのトリガーの場合、入力データにはNEWも含まれますINSERTの行 およびUPDATEトリガー、および/またはOLDUPDATEの行 および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;を使用します。 。