Postgresql

Postgres:在事務中執行 SELECT 不會返回最近的行

  • August 2, 2014

給定一個看起來像這樣的表格佈局

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_stockinv_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();

whereinv_groups_vwVIEW帶有預定義SELECT返回所有項目組裡面的inv_items

是問題VIEW還是問題FUNCTION?我能做些什麼來解決這個問題並能夠在事務中選擇新插入的項目行?……我還有什麼遺漏嗎?

難道是我的條件有問題IF found_item IS NULL THEN

我認為您的問題只是有一個BEFORE觸發器 - 它在插入尚未出現在視圖中的行*之前觸發。*將其更改為AFTER並且(在考慮了 Craig 的建議之後)您就完成了。

引用自:https://dba.stackexchange.com/questions/69578