Postgresql
Postgres:在事務中執行 SELECT 不會返回最近的行
給定一個看起來像這樣的表格佈局
inv_items ========= * id bigserial sku character varying(22) name character varying(32) ... inv_items_stock =============== item_id bigint (inv_items) qty int ... inv_items_group =============== group_id bigint (inv_items) item_id bigint (inv_items)
其中一個項目可能是“庫存項目”或“組項目”(帶有復合項目……)我有一個觸發器在插入/更新之前檢查每個
inv_items_stock
並inv_items_group
確保滿足某些條件;例如,庫存項目不能是組項目。問題是,在我的程序中,我在事務中執行了一批插入;首先我插入
inv_items
,然後插入另一個表。不幸的是,SELECT
我的觸發器函式內部沒有找到我剛剛在事務中插入的任何項目,因此總是失敗。例如,這裡是組項檢查觸發器
CREATE FUNCTION inv_check_set_group_items() RETURNS trigger AS $INV_GRP_SET$ DECLARE found_item bigint; BEGIN SELECT id INTO found_item FROM inv_groups_vw WHERE id = NEW.group_id; IF found_item IS NULL THEN RAISE EXCEPTION 'Invalid group item'; END IF; RETURN NEW; END; $INV_GRP_SET$ LANGUAGE plpgsql; CREATE TRIGGER inv_check_set_group_items BEFORE INSERT OR UPDATE ON inv_items_group FOR EACH ROW EXECUTE PROCEDURE inv_check_set_group_items();
where
inv_groups_vw
是VIEW
帶有預定義SELECT
返回所有項目組裡面的inv_items
。是問題
VIEW
還是問題FUNCTION
?我能做些什麼來解決這個問題並能夠在事務中選擇新插入的項目行?……我還有什麼遺漏嗎?難道是我的條件有問題
IF found_item IS NULL THEN
?
我認為您的問題只是有一個
BEFORE
觸發器 - 它在插入尚未出現在視圖中的行*之前觸發。*將其更改為AFTER
並且(在考慮了 Craig 的建議之後)您就完成了。