По сути, мы хотели бы создать TRIGGER для каждой таблицы, которую мы хотим получать для операции UPDATE / INSERT / DELETE. Как только этот триггер сработает, он выполнит функцию, которая просто добавит новую строку (кодирующую событие) в таблицу журнала, которую мы затем опросим из внешней службы.
Это довольно стандартное использование для триггера.
Прежде чем идти в олл-ин с Postgres TRIGGER, нам хотелось бы узнать, как они масштабируются: сколько триггеров мы можем создать в одной установке Postgres?
Если вы продолжите создавать их, в конечном итоге вам не хватит места на диске.
Там нет конкретного ограничения для триггеров.
Ограничения PostgreSQL документированы на странице about .
Влияют ли они на производительность запросов?
Это зависит от типа триггера, языка триггера и того, что делает триггер.
Простой BEFORE ... FOR EACH STATEMENT
триггер PL / PgSQL, который ничего не делает, имеет почти нулевые издержки.
FOR EACH ROW
триггеры имеют более высокие издержки, чем FOR EACH STATEMENT
триггеры. Масштабирование, очевидно, с учетом количества строк.
AFTER
триггеры дороже, чем BEFORE
триггеры, потому что они должны быть поставлены в очередь, пока оператор не завершит свою работу, а затем исполнится. Они не выводятся на диск, если очередь становится большой (по крайней мере, в 9.4 и ниже, может измениться в будущем), поэтому огромные AFTER
очереди запуска могут привести к переполнению доступной памяти, что приведет к прерыванию оператора.
Триггер, который изменяет NEW
строку перед вставкой / обновлением, дешевле, чем триггер, который выполняет DML.
Конкретный вариант использования, который вы хотите, будет лучше работать с улучшением, которое может быть реализовано в PostgreSQL 9.5 (если нам повезет), где FOR EACH STATEMENT
триггеры могут видеть виртуальные OLD
и NEW
таблицы. Это невозможно в текущих версиях PostgreSQL, поэтому вы должны использовать FOR EACH ROW
триггеры.
Кто-нибудь раньше пробовал это?
Конечно. Это довольно стандартное использование для триггеров, наряду с аудитом, проверкой работоспособности и т. Д.
Вы захотите изучить LISTEN
и NOTIFY
найти хороший способ разбудить вашего работника, когда произойдут изменения в таблице задач.
Вы уже делаете самое важное, избегая общения с внешними системами напрямую от триггеров. Это имеет тенденцию быть проблематичным для производительности и надежности. Люди часто пытаются сделать что-то вроде отправки почты прямо из триггера, и это плохие новости.