postgresql - PostgreSQL PERFORM 不触发事件
问题描述
我为 INSERT 事件创建了一个触发器。
CREATE TABLE TBLEXAMPLE
(
KEY1 CHARACTER VARYING(10) NOT NULL,
KEY2 CHARACTER VARYING(14) NOT NULL,
VALUE1 CHARACTER VARYING(20),
VALUE2 CHARACTER VARYING(20) NOT NULL,
CONSTRAINT TBLEXAMPLE_PKEY PRIMARY KEY (KEY1, KEY2)
);
CREATE TRIGGER TBLEXAMPLE_AFTER
AFTER INSERT
ON TBLEXAMPLE
FOR EACH ROW
EXECUTE PROCEDURE NOTIFY();
CREATE OR REPLACE FUNCTION NOTIFY() RETURNS trigger AS
$BODY$
BEGIN
PERFORM pg_notify(CAST('myEvent' as text), row_to_json(NEW)::text);
RETURN new;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE COST 100;
但是,执行插入不会触发任何事件。
INSERT INTO TBLEXAMPLE(KEY1, KEY2, VALUE1, VALUE2) VALUES ('k1', 'k2', 'v1', 'v2');
如果我从控制台明确通知,则会触发事件:-
NOTIFY myEvent, '{"id": 3, "state": "active"}';
解决方案
该NOTIFY
命令的语法是
NOTIFY channel [ , payload ]
Postgres 标识符channel
在哪里。因此通道在
NOTIFY myEvent, '{"id": 3, "state": "active"}';
自动转换为myevent
,而函数pg_notify()
不进行转换。利用:
CREATE OR REPLACE FUNCTION NOTIFY() RETURNS trigger AS
$BODY$
BEGIN
PERFORM pg_notify('myevent', row_to_json(NEW)::text);
RETURN new;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE COST 100;
或者一般来说,不要在 Postgres 标识符中使用 cameCase。
推荐阅读
- firebase - 如何将 React-Native-camera 拍摄的图像上传到 Firebase 存储?
- postman - 没有从邮递员那里得到正确的 json 格式的响应
- cmake - 如何将文件列表传递给 CMake 中的 add_custom_command?
- java - 封装了main方法的类的作用是什么?
- c# - Telerik RadMenu 仅在鼠标悬停而不是单击时展开
- java - 如何用未来修复 java lambda 过滤器(缺少返回语句)
- swift - 空 Swift 字符串内存分配布局(堆栈/堆分配)
- node.js - 如何在 Linux 中正确指定 node.js 中文件的路径?
- python - 如果不存在,则使用 defaultdict 处理对键的动态插入
- java - 如何在标签中显示用户名登录