NOTIFY

用于向其他会话发送通知的 SQL 命令

NOTIFY 是一个实用程序命令,用于向连接到同一数据库的其他会话发送通知,这些会话在使用 LISTEN 命令指定的通道上侦听。

NOTIFY 一直存在于 PostgreSQL 中。

用法

通过执行 NOTIFY channel,或者从 (PostgreSQL 9.0) 开始还可以使用 NOTIFY channel, 'message',将通知传递到在该通道上侦听的所有会话(使用 LISTEN 命令)。侦听的会话在下次执行查询时将收到通知。通知可以选择包含消息。

NOTIFY 和事务

NOTIFY 在事务上下文中运行。通知仅在事务提交后才会传输,如果事务回滚,则不会发送。

pg_notify()

函数 pg_notify() 提供与 NOTIFY 相同的功能,并可以从表或表达式派生的值执行通知。

统计信息

从 (PostgreSQL 13) 开始,pg_stat_slru 返回的 Notify 记录包含有关 NOTIFY 用法的统计信息。

更改历史记录

示例

基本 NOTIFY 用法示例

postgres=# NOTIFY foo;
NOTIFY

这会向在通道 foo 上侦听的所有会话发送通知,并在他们执行查询时接收。

postgres=# LISTEN foo;
LISTEN

postgres=# SELECT pg_backend_pid();
 pg_backend_pid 
----------------
          23711
(1 row)

Asynchronous notification "foo" received from server process with PID 20679.

如果会话在该通道上侦听,它将接收自己的通知。

postgres=# LISTEN foo;
LISTEN

postgres=# NOTIFY foo;
NOTIFY

Asynchronous notification "foo" received from server process with PID 20679.
postgres=# NOTIFY foo;

为了简化后续示例,它们将显示为会话在其自己的通道上侦听。

可以使用通知传递最多 7999 字节的可选项消息。

postgres=# NOTIFY foo, 'hello world';
NOTIFY
Asynchronous notification "foo" with payload "hello world" received from server process with PID 20679.

消息必须指定为字符串(并且不能为 NULL),但如果字符串为空,则 NOTIFY 的行为就像没有提供消息一样。

postgres=# NOTIFY foo, NULL;
ERROR:  syntax error at or near "NULL"
LINE 1: NOTIFY foo, NULL;
                    ^
postgres=# NOTIFY foo, '';
NOTIFY

Asynchronous notification "foo" received from server process with PID 20679.

如果字符串超过最大长度(默认情况下为 7999 字节),则会引发错误。

postgres=# NOTIFY 'foo', '... very long message ...'; 
ERROR: payload string too long

消息字符串必须作为文字提供;无法从表达式(例如,通过连接或作为函数的结果)生成它们。

postgres=# NOTIFY foo, 'foo' || 'bar';
ERROR:  syntax error at or near "||"
LINE 1: NOTIFY foo, 'foo' || 'bar';
                          ^
postgres=# NOTIFY foo, REPEAT('bar', 2);
ERROR:  syntax error at or near "REPEAT"
LINE 1: NOTIFY foo, REPEAT('foo', 2);
                    ^

但是,这可以通过 pg_notify() 实现。

通知仅在事务提交后才会发送。

postgres=# BEGIN;
BEGIN

postgres=*# NOTIFY foo, 'hello world';
NOTIFY

postgres=*# COMMIT;
COMMIT
Asynchronous notification "foo" with payload "hello world" received from server process with PID 20679.

如果事务回滚,则不会发送通知。

postgres=# BEGIN;
BEGIN

postgres=*# NOTIFY foo, 'hello world';
NOTIFY

postgres=*# ROLLBACK ;
ROLLBACK
  • PostgreSQL 文档: NOTIFY

类别

异步通知实用程序命令

另请参阅

pg_notify()LISTENUNLISTENpg_notification_queue_usage()max_notify_queue_pagestrace_notify

反馈

提交任何关于“NOTIFY”的评论、建议或更正 此处