我已经为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"}';
答案 0 :(得分:1)
NOTIFY
命令的
NOTIFY channel [ , payload ]
其中channel
是Postgres identifier.,因此
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。