Postgresqlに次のコードがあります:
CREATE OR REPLACE FUNCTION update_category() RETURNS trigger AS $newProduct$
BEGIN
UPDATE category SET product_count = product_count + 1 WHERE cat_id = NEW.cat_id;
INSERT INTO notification (content, type, p_id) VALUES('new product', 1, NEW.p_id);
RETURN NEW;
END;
$newProduct$ LANGUAGE plpgsql;
CREATE TRIGGER update_cat AFTER INSERT ON product
EXECUTE PROCEDURE update_category();
そして、製品にレコードを挿入した後、エラーが発生します。
[2017-03-20 16:05:05] [55000] ERROR: record "new" is not assigned yet
[2017-03-20 16:05:05] Detail: The Tuple structure of a not-yet-assigned record is indeterminate.
[2017-03-20 16:05:05] Where: SQL statement "UPDATE category SET product_count = product_count + 1 WHERE cat_id = NEW.cat_id"
[2017-03-20 16:05:05] PL/pgSQL function update_category() line 3 at SQL statement
私は解決策を探しましたが、エラーが原因である場合のみを見つけました
FOR EACH STATEMENT
の代わりに使用されています
FOR EACH ROW
プロシージャを1回実行するだけなので、このソリューションは私の場合には適用されません。
ご協力いただきありがとうございます!
解決策は確かに各行に追加することでした:
CREATE TRIGGER update_cat AFTER INSERT ON product
FOR EACH ROW EXECUTE PROCEDURE update_category();
FOR EACH ROWは、挿入された行ごとではなく、製品の行ごとに1回プロシージャを呼び出すことを意味すると想定しました。