Разумно ли использовать триггер для обновления другой таблицы?

dba.stackexchange https://dba.stackexchange.com/questions/4215

  •  16-10-2019
  •  | 
  •  

Вопрос

у меня есть Object таблица, заполняемая из интегрированной службы (который я могу изменить при необходимости) из другой базы данных.В определенные моменты нам нужно вручную добавлять сообщения в другую таблицу. ObjectObjectGroup (ObjectId, ObjectGroupId) что нужно, если Object.ObjectType иметь определенное целочисленное значение.Поскольку служба интеграции не обрабатывает такого рода обновления, я подумываю добавить триггер в таблицу объектов, который в псевдокоде будет следующим:

if Object.ObjectType = 10
    begin
        if Object.ObjectNumber like '<string pattern>'
        begin
            insert into ObjectObjectGroup values...
        end
    end

Разумна ли такая установка или есть лучший способ с точки зрения производительности?

Это было полезно?

Решение

В основном копировать/вставать из моего ответа из этого вопрос на Stackoverflow

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

Некоторые вещи, которые бы я все еще использовал триггеры для

  • Отслеживание полей "date_created" и "date_last_edited"
  • Вставка "ID" (в Oracle, где нет поля Auto ID)
  • Сохраняя историю изменений

Вещи, которые вы не хотели бы использовать триггеры для

  • бизнес -правила/логика
  • Все, что подключается за пределами базы данных (например, вызов веб -сервиса)
  • Контроль доступа
  • Все, что не транзакционно (все, что вы делаете в триггере, должно быть в состоянии отказ от транзакции)

Другие советы

Да, это мудро. Это цель триггера фактически для выполнения необходимых действий после операции вставки/обновления/удаления по таблице.

Вы должны принять во внимание тот факт, что триггер в MS SQL не будет обрабатывать каждую строку отдельно, но будет обрабатывать все ряды текущей транзакции одновременно. Поэтому, если операция будет вставить 10 строк одновременно, вам нужно подумать, что код вашего триггера обрабатывает все строки одновременно.

Триггеры — мощный инструмент, и, как и любой другой инструмент, при их использовании необходимо соблюдать осторожность.

  1. Когда вы совершаете ошибку в триггерных вещах, могут постигнуться радикально неправильно, и если вы не запускаете следы, вы не поймете ...

  2. Они «волшебным образом» изменяют/вставляют/удаляют данные, которые пользователь БД (текущее приложение/любое будущее приложение/разработчик, выполняющий разовое обновление) не осознавал/не намеревался.

Большая проблема заключается в том, что после того, как вы создали триггер, другим разработчикам/пользователям не очевидно, что триггер вообще существует и что он делает.

Тем не менее, они являются отличным инструментом для поддержания целостности ваших данных и для настоящего аудита изменений.

Вам нужно спросить себя, лучше ли логика, которую вы хотите поместить в триггер, лучше всего подходит для приложения (приложений) или для базы данных, взвесив риски с обеих сторон (что произойдет, если появится новое приложение и не обеспечит соблюдение этого правила). правило?)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top