在 PostgreSQL 中,我有一個定義了觸發器的表,它呼叫了一個已定義的 PostgreSQL 函式。觸發器是BEFORE UPDATE。定義觸發器后,我無法更新相關表。如果我重新定義觸發器,因為AFTER UPDATE一切正常。關于為什么的任何想法?該表類似于以下內容:
create table user (
id bigserial constraint pk_userprimary key,
username varchar,
hasreadinstructions smallint,
hasstarted smallint,
hasendeddataentry smallint,
hasviewedresults smallint,
email varchar,
firstname varchar,
lastname varchar,
registrationdate timestamp);
功能是:
create function perform_notify() returns trigger
language plpgsql
as
$$
BEGIN
PERFORM pg_notify('has_read_instructions', 'foo');
RETURN NULL;
END;
$$;
觸發器是:
CREATE TRIGGER has_read_instructions BEFORE UPDATE
ON user FOR EACH ROW EXECUTE PROCEDURE
perform_notify();
如果我使用 BEFORE UPDATE 定義觸發器,如圖所示,對表的更新不起作用,例如:
update user set hasreadinstructions = 1 where id = 1;
結果是 UPDATE 0 并且值不變。
如果我將觸發器更改為AFTER UPDATE,一切似乎都很好,并且我對表的更新可以正常作業,結果為 UPDATE 1 且值已更改。
在這種情況下,我并不特別關心我是否使用BEFORE或AFTER,但我不知道為什么;所以任何幫助理解這一點將不勝感激。
uj5u.com熱心網友回復:
參考檔案:
行級觸發器發射
BEFORE可以回傳null信號觸發經理跳過操作的此行的剩余部分(即,隨后的觸發器不會被觸發,以及INSERT/UPDATE/DELETE沒有此行發生)。
換句話說,通過回傳null,您正在中止update操作。相反,您可以回傳新行:
create function perform_notify() returns trigger
language plpgsql
as
$$
BEGIN
PERFORM pg_notify('has_read_instructions', 'foo');
RETURN NEW; -- Here!
END;
$$;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/388206.html
標籤:PostgreSQL的 触发器 通知 pg-通知
上一篇:觸發器不起作用并且不顯示任何錯誤
