如果表中的条目满足某些条件,则发送NOTIFY。我希望有效负载包含ID号和其他几列信息。是否有postgres方法将变量(OLD.ColumnID等)转换为字符串?
使用postgres 9.3
答案 0 :(得分:3)
@klin是正确的,NOTIFY
不支持字符串文字以外的任何内容。但是有一个函数pg_notify(),它使用正常的参数来处理这种情况。它已经存在至少9.0,并且链接是官方文档 - 总是值得仔细阅读,那里有大量的信息。
答案 1 :(得分:2)
我的猜测是通知必须在触发功能中完成。使用动态查询,例如
execute format('notify channel, ''id: %s''', old.id);
答案 2 :(得分:0)
解决方案是将Postgres升级到支持JSON的版本。
答案 3 :(得分:0)
甚至postgresql 9.3也支持json。您可以使用row_to_json(payload)::text
答案 4 :(得分:0)
很抱歉,答案很长,我也不能不对其他答案做出反应。
format
版本在很多方面都失败了。在执行之前,您应该准备计划。 “ pseudo命令”不符合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;