我一直在使用PostgreSQL的通知系统,但终生无法弄清楚为什么pg_tify(text,text)永远不起作用.这个特性没有过多的文档记录,而且我找不到很多在野外使用的例子,所以我想没有人会介意我在这里问一下.

运行以下命令完全符合预期:

LISTEN my_channel;

NOTIFY my_channel, 'my message text';

但是,使用pg_tify()函数会返回空值,并且不会发送任何通知.也没有给出错误.这种用法的一个示例是:

SELECT pg_notify('my_channel', 'my message text');

我可以使用Notify功能,但是我的目标是将通知简化为查询,如下所示:

select pg_notify(get_player_error_channel(username)::TEXT, 'test'::TEXT)
    from player;

我想我一定错过了一些可笑的东西,但我一点运气都没有,找出了原因.讨论通知的页面可以在这里找到:http://www.postgresql.org/docs/9.0/static/sql-notify.html

在它上面,它提到了关于pg_tify()的这一点,这让我认为不会有太大的不同.

pg_notify

一如既往地感谢您的帮助

编辑:数据库版本为: i686-PC-LINUX-GNU上的PostgreSQL 9.0.3,GCC GCC(GCC)4.2.4编译,32位

推荐答案

我已经在postgresql邮件列表(http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php)上讨论过这个问题,并被告知了这种行为的原因.

他们的回答是:".你必须用双引号引用你的名字(听"测试").如果你

这意味着,由于通道总是被迫使用小写字母,因此以下操作可以正常工作

LISTEN ERRORCHANNEL;

NOTIFY ERRORCHANNEL, 'something!';
NOTIFY eRrorChanNel, 'something!';

如果要在频道名称周围添加双引号,则会保留该 case .

因此,在以下情况下,您将收到第一个通知,但不会收到第二个通知:

LISTEN "ERRORCHANNEL";

NOTIFY "ERRORCHANNEL", 'something!'; 
NOTIFY "eRrorChanNel", 'something!';

同样,由于双引号强制维护ERRORCHANNEL的情况,因此以下内容也将起作用:

LISTEN "ERRORCHANNEL";

SELECT pg_notify('ERRORCHANNEL', 'something!');

虽然这不会起作用:

LISTEN ERRORCHANNEL;

SELECT pg_notify('ERRORCHANNEL', 'something!');

在这种情况下,在LISTEN命令中ERRORCHANNEL没有用双引号引起来,因此PostgreSQL强制它使用小写.通道参数的类型是TEXT而不是RENAME,因此在pg_tify()函数中大小写保持不变.通道不匹配(ERRORCHANNE!=errorchannel),因此永远不会收到通知.

Database相关问答推荐

如何自动更新不同的数据库?

Postgres和Oracle之间 Select 查询的结果差异

使用 Npgsql 执行年龄查询并在 .NET 应用程序中返回结果?

从 GCP 机密管理器中读取 .DER 值并将其保存到 .DER 文件

一个强大的 MySQL 管理工具,具有与 SQL Server Management Studio 类似的功能

使用自动递增主键将 csv 导入 sqlite

通过 mySQL 命令行直接上传图片

Select 正确的数据库:MySQL 与Everything 其它数据库

SQL Server 简单插入语句超时

SQL Server 2008 中的 Open Table go 了哪里?

如何在 PDO 中获取数据库名称?

有什么理由不应该在生产中使用 h2 数据库?

ORM 还是Vietnam of Computer Science吗?

Python中准备好的语句和参数化查询之间的混淆

App=EntityFramework 在 Sql 连接字符串中有什么作用?

如何在数据库中获取原始的created_at值(不是转换为 ActiveSupport::TimeWithZone 的对象)

有哪些不同类型的索引,每种索引的好处是什么?

多币种 - 存储什么以及何时转换?

NoSQL 数据库是否使用或需要索引?

SqlParameterCollection only accepts non-null SqlParameter type objects, not String objects