簡體   English   中英

我如何發送列值作為Postgresql NOTIFY消息中的有效載荷?

[英]How can I send column values as the payload in a postgresql NOTIFY message?

如果表中的條目滿足某些條件,則發出NOTIFY。 我希望有效負載包括ID號和其他幾列信息。 是否有一種postgres方法將變量(OLD.ColumnID等)轉換為字符串?

使用Postgres 9.3

@klin是正確的,即NOTIFY除字符串文字外不支持任何其他內容。 但是,有一個函數pg_notify()接受普通參數來處理這種情況。 至少從9.0開始就存在,並且該鏈接指向官方文檔-始終值得仔細閱讀,那里有大量信息。

我的猜測是,通知必須在觸發函數中完成。 使用動態查詢,例如

execute format('notify channel, ''id: %s''', old.id);

解決方案是將Postgres升級到支持JSON的版本。

甚至Postgresql 9.3也支持json。 您可能剛剛使用過row_to_json(payload)::text

很抱歉,答案很長,我也不能不對其他答案做出反應而走開。

format版本在許多方面失敗。 在執行之前,您應該准備計划。 “偽命令”不符合execute的語法,即

EXECUTE somepreparedplanname (parameter1, ...)

格式中的%s太糟糕了,這樣您可以召喚sql注入攻擊。 當使用format構造查詢時,您需要將%L用作文字%I來用作column / table / function / etc id,而幾乎不使用%s。

使用pg_notify函數的另一個解決方案是正確的。 嘗試

LISTEN channel;
SELECT pg_notify('channel','Id: '|| pg_backend_pid  ());

在psql命令行中。

回到最初的問題:sdemurjian,如果您想在某些觸發函數中使用此通知內容,則在問題中未闡明。 因此,這里有一個示例(可能不是)(因為我來晚了。對此也感到抱歉):

CREATE TABLE columns("columnID" oid, "columnData" text);
CREATE FUNCTION column_trigger_func() RETURNS TRIGGER AS
$$ BEGIN PERFORM pg_notify('columnchannel', 'Id: '||OLD."columnID");
RETURN NEW; END; $$ LANGUAGE plpgsql;
CREATE TRIGGER column_notify BEFORE UPDATE ON columns FOR EACH ROW
EXECUTE PROCEDURE column_trigger_func();
LISTEN columnchannel;
INSERT INTO columns VALUES(1,'testdata');
BEGIN; UPDATE columns SET "columnData" = 'success'; END;
BEGIN; UPDATE columns SET "columnData" = 'fail'; ROLLBACK;

請注意,在早期的postgres版本(9之前的版本)中,notify命令不接受任何有效載荷,並且沒有pg_notify函數。

在8.1中,觸發函數stil的工作方式如下:

CREATE FUNCTION column_trigger_func() RETURNS TRIGGER AS
$$ BEGIN NOTIFY columnchannel; RETURN NEW; END; $$ LANGUAGE plpgsql;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM