![](/img/trans.png)
[英]How can I see the PostgreSQL column type from a RowDescription message?
[英]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.