2010-02-15 4 views
1

(Postgres 8.3)Postgres: сужение сфера триггера

я работаю с БД таблицы X 100+ колонны широкий (которые я не могу изменить, к сожалению), многие из которых обновляется постоянно и очень часто по нормальный бизнес-процесс.

У меня есть требование, чтобы обновить таблицу Y на основе обновлений для конкретного столбца Foo в X обновляется необычным бизнес-процессом. Однако из-за очень большого количества обновлений от X просто применяя триггер, который проверяет X.foo, чтобы решить, следует ли обновлять Y считается неприемлемым.

Таблица Y также не является концом линии, существует цепочка предков несколько глубоких, все из которых должны пузыриться до корня.

Единственное решение я могу думать о том, являются:

  • нарушение X на несколько таблиц (не разрешено)
  • явно делает обновления для YZ и другие) как часть бизнес-логики для обновления X, но это будет иметь большой след и оставляет много места для кого-то, кто ошибается или пропускает его, когда им нужно реализовать то же самое в другом процессе. И это явно просто не хороший дизайн (который я пытается, чтобы постепенно исправить, где я могу).

Кто-нибудь знает способ ограничения запуска триггера по столбцу или любой другой альтернативе? Триггеры по просмотрам? Другие вуду?

ответ

2

Возможно, вы можете что-то делать с правилами, но, как было сказано ранее, триггеры должны, вероятно, быть «достаточно хорошими». Но если вы пытаетесь решить проблему управления, а не техническую, правила могут вам помочь. Они будут применяться гораздо раньше во время исполнения. Остерегайтесь некоторых подводных камней с ними, как правило, с последовательностями и т. Д.

+0

Пошел в конце концов, но в то же время, но, как и на самом деле, проблема управления, имеющая альтернативное решение, была достаточной. Будущие зрители ищут ответ: надеюсь, что у вас есть PG9! – annakata

2

К сожалению, до версии 9.0 (which includes both column triggers and a WHEN clause for triggers) вам придётся прибегнуть ко второму решению.

+0

Спасибо за это, но просто как вопрос путаницы это выглядит как 8.5 не 9.0? – annakata

+0

Прямо сейчас это 8,5 альфа, но будет выпущено как 9.0. –

0

Почему стандартный триггер неприемлем? Запуск функции, которая сначала проверяет, NEW.column_name=OLD.column_name, и просто возвращает, если это то же самое, дешево. Вы можете выстрелить сотнями тысяч из них за секунду. Вероятно, ваша система не может обрабатывать более нескольких сотен транзакций в секунду. — на 3 порядка меньше.

Условные после, отсроченные триггеры в 9.0 будут быстрее, но только примерно в 2 раза быстрее, чем обычный триггер. См. a relevant post в блоге Depesz. Вы можете запустить некоторые тесты в Postgres 9 development version.

+0

Спасибо за ссылку в блоге. Я сильно подозреваю, что это случай бессмысленной оптимизации, но тем не менее я обязан это делать.Триггеры считаются недостойными людей с большей властью, чем я. :/(fwiw мы смотрим несколько тысяч обновлений в секунду). – annakata

+0

Возможно, если вы построите тест с «специальной новой техникой, использующей специальные типы триггеров, которые специально оптимизированы для такого рода ситуаций». С помощью триггера, например «begin», если OLD.colname = NEW.colname, то верните NEW, выберите дорогую_функцию(); конец; и некоторые очень умные звуковые (и по умолчанию ;-)) модификаторы, такие как «VOLATILE STRICT SECURITY INVOKER». – Tometzky

Смежные вопросы