如何获取postgres中每个插入行的pg_notify通知?

时间:2017-02-20 14:42:08

标签: postgresql triggers plpgsql

我试图在新行插入表格时尝试触发pg_notify,但我没有收到每个新插入行的通知,而是只收到一个通知。

触发器是

CREATE TRIGGER "testNotify"
AFTER INSERT ON mine.test
FOR EACH ROW EXECUTE PROCEDURE mine."testNotify"()

功能是

CREATE OR REPLACE FUNCTION mine."testNotify"()
  RETURNS TRIGGER AS $$
DECLARE
BEGIN
  PERFORM pg_notify('testNotify', 'test payload');
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

插入

INSERT INTO mine.test (one, two, three)
SELECT one, two, three FROM temptable
ON CONFLICT DO NOTHING

我已经通过这种方式成功插入了新的100,000行,所以如果我的应用程序执行LISTEN "testNotify",我希望会看到很多通知,但是它只有1,通道为{{1和testNotify的有效负载。我上面做错了吗?

1 个答案:

答案 0 :(得分:4)

Quote from the manual

  

如果从具有相同有效负载字符串的相同事务多次发出相同的通道名称,则数据库服务器可以决定仅发送单个通知。

(强调我的)

并且:

  

另一方面,具有不同有效负载字符串的通知将始终作为不同的通知传递

因此,如果您想确保每行都收到一条通知,请在有效负载中包含该行的主键。