PostgreSQL PERFORM不触发事件

时间:2019-06-25 07:48:13

标签: postgresql plpgsql

我已经为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"}';

1 个答案:

答案 0 :(得分:1)

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。