PostgreSQL PERFORM 不触发事件

PostgreSQL PERFORM not triggering events

我已经为 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命令的

The syntax

NOTIFY channel [ , payload ]

其中 channelPostgres 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。