Лучше ли иметь один триггер для вставки / обновления / удаления или несколько? - PullRequest
2 голосов
/ 09 марта 2012

У меня есть требование отражать операции вставки / обновления / удаления из одной таблицы в другую.Например, вставка в таблицу А должна быть скопирована в таблицу В, обновление таблицы А применено к таблице В, и удаление из таблицы А будет применено к таблице В.Это так просто, за исключением того, что tableB имеет 1 дополнительный столбец для постоянного значения, поэтому нужны очень простые триггеры.

Я не уверен, что лучше написать 3 отдельных триггера или иметь один триггер, которыйвыполняет все операции.

Это для 3 баз данных: Sybase ASE, MSSQL и Oracle, и я хотел бы, чтобы решение оставалось одинаковым (поэтому либо 3 для всех баз данных, либо 1 для всех).

Это просто вопрос предпочтения, иметь 3 триггера против 1, или есть реальная выгода для любого решения?

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Предполагая, что вам действительно нужен триггер, и эту таблицу B нельзя просто определить как представление поверх таблицы A, или эту таблицу B нельзя просто определить с помощью внешнего ключа, который ссылается на строку в A вместе с константой, что Нельзя переопределить, чтобы добавить дополнительный столбец (возможно, со значением по умолчанию для константы), по крайней мере один триггер позволяет хранить всю связанную логику в одном месте, а не иметь несколько мест, которые необходимо обновить, когда вы выполняете что-то вроде добавления новый столбец A. Но я бы крайне настороженно относился к любой архитектуре, в которой использовались две разные таблицы, отражающие по существу одни и те же данные в обеих. Это нарушает нормализацию, увеличивает нагрузку на систему ввода-вывода и делает всю систему более сложной.

2 голосов
/ 06 ноября 2012

Нет никакой эффективности, которая может быть получена путем разделения триггеров, кроме потери эффективности самого выполнения триггера, при попытке определить, какое действие было выполнено в таблице А.

Отдельные триггеры IE 3 не могут использовать логику проверки для определения того, что только что произошло в Таблице A, поскольку сам запускающийся триггер может вести себя в пузыре, потому что он знает, что, поскольку он срабатывает, это произошло из-за одного действия.

В то время как триггер 3-в-1, вы должны проверять состояние виртуальных удаленных и вставленных таблиц и получать действие каждый раз при его запуске.

Если вы не беспокоитесь о (по общему признанию, небольшом) влиянии на производительность при получении «действия», или, возможно, даже не нужно знать в таблице B «действие», которое только что произошло в Aable A ... тогда Я думаю, что 1 отлично.

...