F.44. tcn — una función de trigger para notificar a los oyentes (listeners) sobre cambios en el contenido de una tabla #

El módulo tcn proporciona una función de trigger que notifica a los oyentes (listeners) sobre los cambios en cualquier tabla en la que esté asociada. Debe ser utilizada como un trigger AFTER (después) FOR EACH ROW (para cada fila).

Este módulo se considera trusted (de confianza), es decir, puede ser instalado por no superusuarios que tengan el privilegio CREATE en la base de datos actual.

Solo se puede suministrar un parámetro a la función en una sentencia CREATE TRIGGER, y este es opcional. Si se proporciona, se utilizará como el nombre del canal para las notificaciones. Si se omite, se utilizará tcn como nombre del canal.

La carga útil (payload) de las notificaciones consiste en el nombre de la tabla, una letra para indicar qué tipo de operación se realizó, y pares de nombre/valor de columna para las columnas de la clave primaria. Cada parte se separa de la siguiente por una coma. Para facilitar el análisis mediante expresiones regulares, los nombres de tablas y columnas siempre se envuelven entre comillas dobles, y los valores de los datos siempre se envuelven entre comillas simples. Las comillas incrustadas se duplican.

A continuación se muestra un breve ejemplo de uso de la extensión.

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.