LINUX.ORG.RU

[СУБД] Триггеры

 


0

0

Можете привести примеры, когда применение триггеров оправдано? При том, что ссылочная целостность и без них обеспечивается поддержкой внешних ключей. А вычисляемые поля могут быть реализованы View.

На ум приходит только логгирование изменений в БД.



Последнее исправление: ipc (всего исправлений: 1)

Почему только логгирование? Бизнес логика же.

zJes ★★
()

На ум приходит создание каких-то искусственных ограничений при внесении изменений. Например, чтобы какие-то данные в базе изменялись не чаще определенного интервала времени. Хотя такое, наверное, редко надо.

MuZHiK-2 ★★★★
()

Обычно хитроумная бизнес логика.

А вычисляемые поля могут быть реализованы View.

Во view ты можешь использовать только SQL, который не всегда удобен. Но триггеры нужны не только для замены view'ов. А вообще не парься, если тебе вдруг понадобятся триггеры, ты это сразу поймёшь.

runtime ★★★★
()

Сразу видно, что ты быдлокодер на мускуле или типа того.
И да, все отписались для чего это надо

Pantserovik
()

Много лет назад делал для IPB nntp-гейт. На php-код нормально сесть было нельзя. Пришлось навесить триггеров и процедур, чтобы вели дополнительные таблицы с индексами сообщений. Другого выхода не было.

Vit ★★★★★
()

тривиальный пример: есть таблица продажи(дата_время, продавец, товар, сумма), надо сделать чтобы в таблице продажи_за_неделю(неделя, сумма) всегда были актуальные данные

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от amomymous

>>Например, в Oracle с помощью триггеров реализуется авто-инкремент

Кстати, если не ошибаюсь, в Firebird была похожая ситуация.

MuZHiK-2 ★★★★
()
Ответ на: комментарий от www_linux_org_ru

>тривиальный пример: есть таблица продажи(дата_время, продавец, товар, сумма), надо сделать чтобы в таблице продажи_за_неделю(неделя, сумма) всегда были актуальные данные
Почему не view? А если магазин большой и продажи (добавление в таблицу продажи) происходят чаще, чем просмотр продаж_за_неделю?

ipc
() автор топика
Ответ на: комментарий от ipc

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

zJes ★★
()
Ответ на: комментарий от ipc

> Почему не view? А если магазин большой и продажи (добавление в таблицу продажи) происходят чаще, чем просмотр продаж_за_неделю?

очевидно, что 1 просмотр таблицы продаж_за_неделю сделает (приблизительно) столько же работы, сколько все триггеры (да еще и диском придется пошуршать, в то время как при работе триггера данные уже в оперативке)

при 100 просмотрах таблицы продаж_за_неделю экономия уже в 100 раз

*особенно* если магазин большой.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

а можно использовать материализованную вьюшку
(если они поддерживаются, конечно..)

Ja-Ja-Hey-Ho ★★★★
()
Ответ на: комментарий от zJes

>пример, ты делаешь удаление записи (к примеру, чей-то пост), а триггер у тебя автоматом снимает скор пользователям

А потом кто-то решает почистить старъё, и у всех старых и активных пользователей наступает банный день.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

Это был пример бизнес логики и триггеры в большинстве СУБД вещь включаемая - выключаемая. Вообще холиваров о применении бизнес логики в дб не меньше чем вин/лин.

zJes ★★
()

Открываем доку на oracle и читаем (не привел остальные пункты для чего не надо их делать):
Use triggers to guarantee that when a specific operation is performed, related actions are performed.
Use triggers only for centralized, global operations that should be fired for the triggering statement, regardless of which user or database application issues the statement.

Aleks_IZA
()

>На ум приходит только логгирование изменений в БД.

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

неудачный пример использования триггеров на логировании.

Deleted
()
Ответ на: комментарий от Deleted

и да, примеров использования триггеров мульён, что даже глупо спрашивать про это. вот ты сидя на горшке после акта дефикации автоматом за бумажкой тянешься? :) вот это и есть триггер - случилось событие, запустилось какое-то действие.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.