我想創建一個觸發器,該觸發器在INSERT表上的陳述句成功時運行,使用插入的資料來呼叫pg_notify:
CREATE OR REPLACE FUNCTION notify_updates() RETURNS TRIGGER AS $$
BEGIN
PERFORM pg_notify(NEW.aggregate_type, NEW.aggregate_id::text);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER model_notification
AFTER INSERT ON events
FOR EACH STATEMENT
EXECUTE PROCEDURE notify_updates()
aggregate_type并且aggregate_id是表格的列events。的值aggregate_type是提前知道的,可以提前呼叫LISTEN相關的頻道。
我得到的錯誤是“頻道名稱不能為空”。我猜這是因為觸發器針對每個陳述句而不是針對每一行運行。
有沒有辦法讓這對陳述句觸發器起作用?我認為有趣的部分是可能插入了幾行,而 postgres 不知道應該選擇哪個值?
這個問題類似于Using row data in pg_notify trigger as channel name? ,但我想讓觸發器在每個陳述句而不是每一行上運行,因為在我的特定情況下,每個插入的所有行的值aggregate_type和值都是相同的。aggregate_id
uj5u.com熱心網友回復:
您需要一個轉換表:
CREATE OR REPLACE FUNCTION notify_updates() RETURNS TRIGGER AS $$
BEGIN
PERFORM pg_notify(aggregate_type, aggregate_id::text)
FROM new_table -- transition table
LIMIT 1; -- !!
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER model_notification
AFTER INSERT ON events
REFERENCING NEW TABLE AS new_table -- define transition table name
FOR EACH STATEMENT
EXECUTE PROCEDURE notify_updates();
在檔案中閱讀有關該功能的更多資訊:
- 觸發函式
- 創建觸發器
轉換表是在 Postgres 10 中引入的。另請閱讀觸發器,它將從幾行構建一行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/463037.html
下一篇:如何縮短視圖的執行時間
