繁体   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