首页 > 解决方案 > 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"}';

标签: postgresqlplpgsql

解决方案


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。


推荐阅读