F.59. tcn#

F.59. tcn

F.59. tcn

Модуль tcn предоставляет функцию триггера, которая уведомляет слушателей об изменениях в любой таблице, к которой он присоединен. Он должен быть использован в качестве триггера AFTER для каждой строки FOR EACH ROW.

Этот модуль считается "доверенным", то есть его можно установить недоступным пользователям, у которых есть привилегия CREATE в текущей базе данных.

В операторе CREATE TRIGGER может быть указан только один параметр, и он является необязательным. Если параметр указан, он будет использоваться в качестве имени канала для уведомлений. Если параметр не указан, в качестве имени канала будет использовано tcn.

Содержимое уведомлений состоит из имени таблицы, буквы, указывающей тип операции, и пары имя/значение для столбцов с первичными ключами. Каждая часть разделяется запятой. Для удобства разбора с использованием регулярных выражений имена таблиц и столбцов всегда заключены в двойные кавычки, а значения данных всегда заключены в одинарные кавычки. Встроенные кавычки удваиваются.

Краткий пример использования расширения приведен ниже.

test=# create table tcndata
test-#   (
test(#     a int not null,
test(#     b date not null,
test(#     c text,
test(#     primary key (a, b)
test(#   );
CREATE TABLE
test=# create trigger tcndata_tcn_trigger
test-#   after insert or update or delete on tcndata
test-#   for each row execute function triggered_change_notification();
CREATE TRIGGER
test=# listen tcn;
LISTEN
test=# insert into tcndata values (1, date '2012-12-22', 'one'),
test-#                            (1, date '2012-12-23', 'another'),
test-#                            (2, date '2012-12-23', 'two');
INSERT 0 3
Asynchronous notification "tcn" with payload ""tcndata",I,"a"='1',"b"='2012-12-22'" received from server process with PID 22770.
Asynchronous notification "tcn" with payload ""tcndata",I,"a"='1',"b"='2012-12-23'" received from server process with PID 22770.
Asynchronous notification "tcn" with payload ""tcndata",I,"a"='2',"b"='2012-12-23'" received from server process with PID 22770.
test=# update tcndata set c = 'uno' where a = 1;
UPDATE 2
Asynchronous notification "tcn" with payload ""tcndata",U,"a"='1',"b"='2012-12-22'" received from server process with PID 22770.
Asynchronous notification "tcn" with payload ""tcndata",U,"a"='1',"b"='2012-12-23'" received from server process with PID 22770.
test=# delete from tcndata where a = 1 and b = date '2012-12-22';
DELETE 1
Asynchronous notification "tcn" with payload ""tcndata",D,"a"='1',"b"='2012-12-22'" received from server process with PID 22770.