PostgreSQL PERFORM не вызывает события - PullRequest
1 голос
/ 25 июня 2019

Я создал триггер для событий 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 Ответ

1 голос
/ 25 июня 2019

Синтаксис команды NOTIFY:

NOTIFY channel [ , payload ]

, где channel - это идентификатор Postgres. Следовательно, канал в

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;

или вообще не используйте cameCase в идентификаторах Postgres.

...