Являются ли триггеры базы данных плохой идеей?
По моему опыту, они злые, потому что они могут привести к неожиданным побочным эффектам, и их трудно отлаживать (особенно, когда один триггер запускает другой). Часто разработчики даже не задумываются о поиске триггера.
С другой стороны, кажется, что если у вас есть логика, которая должна возникать каждый раз, когда FOO
в базе данных создается новый объект, то самое надежное место для этого - триггер вставки в таблицу FOO.
Единственный раз, когда мы используем триггеры, для действительно простых вещей, таких как установка ModifiedDate
.
Ответы:
Основные проблемы с триггерами
Это просто означает, что их нужно бережно использовать для соответствующих обстоятельств; что, по моему опыту, ограничено проблемами целостности отношений (иногда с более высокой степенью детализации, чем вы можете получить декларативно); и обычно не для деловых или транзакционных целей. YMMV.
источник
Нет, они на самом деле хорошая идея. Если есть проблема с вашими определенными триггерами, то вы делаете их неправильно, но обычно это означает, что есть проблема с вашей реализацией, а не с концепцией самих триггеров :-).
Мы много используем триггеры, потому что они помещают специфическую для СУБД деятельность под контроль той базы данных, которой она принадлежит. Пользователи СУБД не должны беспокоиться о подобных вещах. Целостность данных зависит от самой базы данных, а не от приложений или пользователей, которые ее используют. Без ограничений, триггеров и других функций в базе данных, приложения оставляют за собой право применять правила, и для уничтожения данных требуется всего одно мошенническое или ошибочное приложение / пользователь.
Например, без триггеров не было бы таких удивительных вещей, как автоматически сгенерированные столбцы, и вам пришлось бы обрабатывать функцию в каждой строке при их выборе. Это может снизить производительность СУБД, гораздо лучше создать автоматически сгенерированный столбец во время вставки / обновления, поскольку это единственный раз, когда он изменяется.
Кроме того, отсутствие триггеров помешает применению правил данных в СУБД, таких как предварительные триггеры, для обеспечения того, чтобы столбцы имели определенный формат. Обратите внимание, что это отличается от правил целостности данных, которые обычно являются просто поисками внешнего ключа.
источник
Инструменты никогда не являются злыми. Применение этих инструментов может быть злым.
источник
Я согласен. Проблемы с триггерами - это люди, а не триггеры. Несмотря на то, что на это нужно смотреть больше, нужно больше думать и увеличивать бремя кодировщиков, проверяющих вещи правильно, мы не отказываемся от индексов, чтобы упростить нашу жизнь. (Плохие индексы могут быть такими же плохими, как и плохие триггеры)
Важность триггеров (на мой взгляд) заключается в том, что ...
- Любая система всегда должна быть в допустимом состоянии.
- Код для обеспечения соблюдения этого допустимого состояния должен быть централизованным (не записанным в каждом SP).
С точки зрения обслуживания, триггер очень полезен для конкурирующих программистов и проблем для более младших / любительских. Тем не менее, эти люди должны учиться и расти как-то.
Я думаю, это зависит от вашей рабочей среды. Есть ли у вас надежные люди, которые хорошо учатся и могут быть методичными? Если нет, то, по-видимому, у вас есть два варианта:
- Примите, что вам придется потерять функциональность, чтобы компенсировать
- Примите, что вам нужны другие люди или лучшее обучение и управление
Они звучат резко, и я думаю, что они есть. Но это основная истина, на мой взгляд ...
источник
Я думаю, что триггеры не только не злые, но и необходимы для хорошего дизайна базы данных. Прикладные программисты считают, что на базы данных влияет только их приложение. Они часто ошибаются. Если необходимо поддерживать целостность данных независимо от того, откуда произошли изменения, триггеры являются требованием, и глупо их избегать, потому что некоторые программисты слишком этноцентричны, чтобы полагать, что что-то кроме их дорогого приложения может влиять на вещи. Нетрудно спроектировать, протестировать или устранить неисправность триггера, если вы являетесь компетентным разработчиком базы данных. Также трудно определить, что триггер вызывает неожиданный результат, если вам кажется (как и мне), чтобы посмотреть там. Если я получаю сообщение об ошибке, говоря, что таблица, на которую я не ссылаюсь в моем sp, содержит ошибку FK, Я знаю, даже не задумываясь о том, что триггер вызывает проблему, как и любой компетентный разработчик баз данных. Помещение бизнес-правил только в приложение - причина номер один, которую я обнаружил для плохих данных, поскольку другие даже не подозревают, что правило существует, и нарушают его в своих процессах. Правила, ориентированные на данные, принадлежат базе данных, и триггеры являются ключом к реализации более сложных.
источник
some programmers are too ethnocentric to consider that something other than their prized application may be affecting things
В основном да.
Сложность с триггером в том, что он делает вещи «за спиной»; разработчик, поддерживающий приложение, может легко не понять, что оно там, и внести изменения, которые все испортили, даже не заметив.
Это создает уровень сложности, который просто добавляет работы по обслуживанию.
Вместо использования триггера хранимая процедура / подпрограмма, как правило, может быть выполнена для того же, но понятным и понятным способом - вызов хранимой подпрограммы означает, что разработчик может посмотреть на ее исходный код и точно увидеть, что происходит.
источник
Триггеры являются чрезвычайно мощными и полезными, существует множество сценариев, в которых триггер является лучшим решением проблемы.
Они также являются очень хорошим инструментом для взлома. Часто возникают ситуации, когда вы не можете непосредственно контролировать как код, так и базу данных. Если вам придется ждать 2 месяца до следующего основного выпуска вашего кода, но вы можете немедленно применить исправление к своей базе данных, тогда вы можете установить триггер на таблицу для выполнения некоторых дополнительных функций. Затем, когда выпуск кода возможен, вы можете при желании заменить этот триггер своей версией с той же функциональностью.
В конце концов, все «зло», если вы не знаете, что он делает. Решить, что это триггеры, потому что есть разработчики, которые их не понимают, - то же самое, что утверждать, что автомобили - это зло, потому что некоторые люди не могут водить ...
источник
Триггеры имеют свое применение - ведение журнала / аудит и поддержание даты «последнего изменения» - два очень хороших применения, которые были упомянуты в предыдущих ответах.
Тем не менее, один из основных принципов хорошего дизайна заключается в том, что бизнес-правила / бизнес-логика / как бы вы это ни называли, должны быть сосредоточены в одном месте. Помещение части логики в базу данных (через триггеры или хранимые процедуры), а часть в приложение нарушает этот принцип. Дублирование логики в обоих местах еще хуже, так как они всегда будут синхронизированы друг с другом.
Существует также «принцип наименьшего удивления», о котором уже упоминалось.
источник
Триггеры являются хорошим инструментом при правильном использовании. Специально для таких вещей, как аудит изменений, заполнение таблиц суммирования и т. Д.
Теперь они могут быть «злыми», если вы попадете в «адский триггер» с одним триггером, который запускает другие триггеры. Однажды я работал над продуктом COTS, где у них было то, что они называли «триггерами гибкого трубопровода». Эти триггеры были сохранены в таблице, так как динамические строки SQL были скомпилированы каждый раз, когда они выполнялись. Скомпилированные триггеры просматривают и проверяют, есть ли в этой таблице какие-либо триггеры flex для запуска, а затем компилируют и запускают триггер «flex». Теоретически это звучало как очень крутая идея, потому что продукт был легко настроен, но реальность заключалась в том, что база данных взорвалась из-за всех компиляций, которые она должна была делать ...
Так что, да, они великолепны, если вы держите то, что делаете, в перспективе. Если это что-то довольно простое, например, одитинг, суммирование, автопоследовательность и т. Д., То это не проблема. Просто помните о темпах роста таблицы и о том, как триггер повлияет на производительность.
источник
На высоком уровне есть два варианта использования триггеров1
1) Чтобы все происходило «автоматически». В этом случае триггеры вызывают побочный эффект, они изменяют данные способами, которые не ожидались, учитывая (примитивный) оператор вставки, обновления или удаления, который был выполнен и вызвал срабатывание триггера.
Общее согласие здесь заключается в том, что триггеры действительно вредны. Потому что они изменяют хорошо известную семантику оператора INSERT, UPDATE или DELETE. Изменение семантики этих трех примитивных операторов SQL укусит других разработчиков, которым в будущем потребуется работать с таблицами базы данных, которые больше не ведут себя ожидаемым образом при работе с ними с примитивами SQL.
2) Для обеспечения соблюдения правил целостности данных, кроме тех, с которыми мы можем обращаться декларативно (используя CHECK, PRIMARY KEY, UNIQUE KEY и FOREIGN KEY). В этом сценарии использования все триггеры - это данные QUERY (SELECT), чтобы проверить, разрешено или нет изменение, вносимое INSERT / UPDATE / DELETE. Так же, как декларативные ограничения делают для нас. Только в этом случае мы (разработчики) запрограммировали правоприменение.
Использование триггеров для последнего варианта использования не является вредным.
Я веду блог по этому адресу: http://harmfultriggers.blogspot.com
источник
Я знаю разработчиков, которые думают, что триггеры должны всегда использоваться там, где это самый прямой способ достижения желаемой функциональности, и разработчиков, которые никогда не будут. Это почти как догма между двумя лагерями.
Однако я лично полностью согласен с MarkR - вы можете (почти) всегда писать код, функционально эквивалентный триггеру, который будет более заметным и, следовательно, более легким в обслуживании.
источник
Не зло Они на самом деле упрощают такие вещи, как
1. Регистрация / аудит изменений в записях или даже схемах баз данных.
У вас может быть триггер ALTER TABLE, который откатывает изменения в вашей производственной среде. Это должно предотвратить любые случайные модификации таблицы.
2. Обеспечение ссылочной целостности (отношения первичного / внешнего ключа и т. Д.) В нескольких базах данных.
источник
ALTER TABLE
.Нет, они не злые - их просто неправильно поняли :-D
Триггеры имеют правильное применение, но слишком часто как ретро-хак, который в конечном итоге ухудшает ситуацию.
Если вы разрабатываете БД как часть приложения, логика всегда должна быть в коде или sprocs, делающих вызов. Спусковые механизмы позже приведут к боли отладки.
Если вы понимаете, как блокировка, взаимоблокировка и как БД обращаются к файлам на диске, то правильное использование триггеров (например, аудит или архивирование прямого доступа к БД) может быть очень полезным.
источник
Сказать, что они злые, - это преувеличение, но они могут стать причиной меша. Когда срабатывание одного триггера вызывает срабатывание других триггеров, это становится действительно сложным. Допустим, они хлопотны: http://www.oracle.com/technology/oramag/oracle/08-sep/o58asktom.html
Выполнять бизнес-логику в Oracle с триггерами сложнее, чем кажется из-за проблем с множественным параллелизмом. Вы не увидите изменений в другом сеансе, пока другие сеансы не будут зафиксированы.
источник
Они определенно не злые. Я нашел триггеры полезными при рефакторинге схем базы данных, при переименовании столбца или разделении столбца на два столбца или наоборот (пример: регистр имени / фамилии) и при содействии перехода.
Они также очень полезны для аудита.
источник
Этот ответ относится конкретно к SQL Server. (хотя это может также относиться к другим СУБД, я понятия не имею. Я бы предпочел дать здесь ответ, но это было закрыто, как обман.)
Один аспект, не упомянутый ни в одном из ответов, - это безопасность. Поскольку по умолчанию триггеры выполняются в контексте пользователя, который выполняет инструкцию, вызывающую срабатывание триггера, это может вызвать угрозу безопасности, если не будут проверены все триггеры.
Пример, приведенный в BOL под заголовком « Управление безопасностью триггера », относится к пользователю, который создает триггер, содержащий код
GRANT CONTROL SERVER TO JohnDoe ;
, для повышения своих собственных разрешений.источник
Если есть побочные эффекты, это проблема дизайна. В некоторых системах баз данных нет другой возможности установить поле автоинкремента, т.е. для поля идентификатора первичного ключа.
источник
Я думаю, что они могут быть злыми, но только такими же злыми, как и все остальное в процессе развития.
Хотя у меня нет особого опыта с ними, у меня были они в недавнем проекте, над которым я работал, который привел меня к такому выводу. Проблема, с которой я столкнулся, заключается в том, что они могут привести к тому, что бизнес-логика окажется в двух местах: библиотека кода и база данных.
Я вижу это как аналогичный аргумент с использованием sprocs. У вас часто будут разработчики, которые действительно хорошо умеют писать SQL-логику в базу данных, в то время как у людей, у которых нет бизнес-логики, есть другие.
Поэтому мое практическое правило - посмотреть, какова структура вашего проекта. Если кажется целесообразным хранить бизнес-логику в базе данных, то было бы полезно иметь триггеры.
источник
Действительно, довольно часто триггеры используются неправильно. На самом деле в большинстве случаев они вам даже не нужны. Но это не делает их обязательно плохими.
Сценарий, который мне приходит в голову, когда триггеры полезны, это когда у вас есть устаревшее приложение, для которого у вас нет исходного кода, и нет способа его изменить.
источник
Идея триггеров - не зло, ограничение вложенности триггеров - зло.
источник