数据库 – 使用pg_notify(文本,文本)在PostgreSQL中的LISTEN / N
我一直在玩PostgreSQL的通知系统,不知道为什么pg_notify(文本,文本)从未工作.这个功能没有被过多的记录,我找不到很多在野外使用的例子,所以我想没有人会介意我在这里问.
按照预期运行以下工作: LISTEN my_channel; NOTIFY my_channel,'my message text'; 然而使用pg_notify()函数返回空值,并且不会发送通知.也没有错误.使用的一个例子是: SELECT pg_notify('my_channel','my message text'); 我可以使用NOTIFY功能,但我的目标是将通知简化为一个查询,如下所示: select pg_notify(get_player_error_channel(username)::TEXT,'test'::TEXT) from player; 我假设我一定会错过一些可笑的东西,但是我没有想到这个原因.可以在这里找到讨论NOTIFY的页面:http://www.postgresql.org/docs/9.0/static/sql-notify.html 在它上面,它提到了关于pg_notify(),这使我认为没有什么大不相同的.
感谢一如既往的协助 编辑:数据库版本是: 解决方法我已经在PostgreSQL邮件列表(http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php)上讨论过这个问题,并被告知有关行为的推理.他们的答案是“你必须双引号(请听”测试“) 这意味着以下工作是因为通道总是被迫小写 LISTEN ERRORCHANNEL; NOTIFY ERRORCHANNEL,'something!'; NOTIFY eRrorChanNel,'something!'; 如果您要在频道名称周围添加双引号,则会维护该情况. 所以,以下,你会收到第一个通知,但不是第二个: LISTEN "ERRORCHANNEL"; NOTIFY "ERRORCHANNEL",'something!'; NOTIFY "eRrorChanNel",'something!'; 类似地,以下将工作,因为双引号强制维护ERRORCHANNEL的情况: LISTEN "ERRORCHANNEL"; SELECT pg_notify('ERRORCHANNEL','something!'); 虽然这不行: LISTEN ERRORCHANNEL; SELECT pg_notify('ERRORCHANNEL','something!'); 在这种情况下,ERRORCHANNEL在LISTEN命令中不是双引号,所以PostgreSQL强制它小写. channel参数的类型是text,而不是relname,所以在pg_notify()函数中保持不变.通道不一致(ERRORCHANNE!= errorchannel),所以通知不会被接收. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |