Comments 49
во! то что искал, и самое обидное-то знал про это, но напроч из головы вылетело!
А вот для меня это новенькая вещь… спасибо!.. применений найдется не мало… но вот как насчет производительности?
Производительность будет слабая. К примеру на Oracle триггеры являются главной затычкой во многих системах, потому к их использованию нужно подходить очень аккуратно.
В общем случае не согласен. К примеру, обновить вновь вставляемую запись в триггере INSERT BEFORE через алиас NEW будет быстрее и производительнее, нежели делать UPDATE сразу после вставки (или использования INSERT AFTER :)). В общем, возможны варианты :)
Смотрю мой комментарий в минус не ушел, значит актуально (на момент написания +3 +1 (я))
Как обычно, в комментах куча всего полезного :) спасибо за ссылку
А упомянуть, что триггеры добавляются только при наличии привилегии SUPER? Именно этот факт и делает их столь неудобными.
самый большой косяк триггеров — если затык в базе фиг определишь что дело в триггерах, но точнее определить очень и очень сложно.
UFO landed and left these words here
UFO landed and left these words here
UFO landed and left these words here
INSERT INTO log Set msg = 'insert', row_id = NEW.id;
Здесь под NEW подразумевается строка, которая будет вставлена.
INSERT INTO backup Set row_id = OLD.id, content = OLD.content;
OLD строка, к которой еще не применены каие-либо действия
UFO landed and left these words here
Скажите, в чём суть статьи, если Вы просто кратко пересказали и без того короткую главу мануала?
может быть Вы наконец научите меня писать статьи? расскажите как это делается?
а плюс хотя бы в том, что статья написана ( и обсуждается ) на русском языке…
если Вам кажется, что такая статья не нужна хабру — смело ставьте минус… а лучше напишите такую, которая на Ваш взгяд будет лучше…
охотно изучу…
Учить не буду, ибо сам не умею писать :)

Могу показать несколько моментов, которые лично мне не понравились. Навкидку:

Не написано, а для чего, собственно, они вообще нужны? Новичкам (а ведь именно на них рассчитывалась статья, так ведь?) надо показать, что триггеры — это удобно круто и модно. Пару красивых аргументов привести, а не слова а-ля «не вызывается непосредственно».
Где хоть слово про то, что в mysql триггеры можно создавать только с суперпривилегиями?
Почему не указано, что мускул не умеет полностью работать с той таблицей, на которую вешается триггер (об этом в мануале написано очень вскользь, понять без практики, IMHO, довольно сложно)?
Чуть выше в комментариях спрашивалось про алиасы OLD и NEW. Вот Вы их просто указали в примере. А где объясление, что это такое, для чего?

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

Не обессудьте, но я бы на Вашем месте оформил бы этот топик в виде ссылки на официальную документацию.

Главная полезность для меня как для тотального новичка заключается в том, что можно совмещать INSERT и UPDATE для определённых случаев. Я прав?
А как насчет прав? Недавно пришлось столкнуться с тем, что, оказывается, для того, чтобы создать триггер, нужны права суперпользователя (мануал говорит, что до версии 5.1.6), а на шаред-хостинге такого счастья тебе никто не позволит.
начнем с того, что на большинстве шаред-хостингов стоит еще mysql 4й ветки…
мне попадались адекватные хостеры, в саппорт высылался sql-код нужных триггеров, они сами его выполняли…
все зависит от постановки работы с клиентом… люди, которым важны клиенты, тебе по запросу поставят 5й mysql
все понятно, просто об этом стоило бы упомянуть в статье. иначе все ломанутся их использовать в разработке, а потом при деплойменте проблем не оберешься.
Мастерхост мне жестко сказал, что такой возможности мне не дадут…
Пришлось логику организовывать на стороне, а так идеально было бы все в мускуле оставить =(
Спасибо за статью, кратко и ёмко) Если бы было чем — послал бы симпафки)
С точки зрения простоты триггеры — не очень удачное решение, поскольку запутывают структуру и логику базы данных. Если требуется сделать нечто больше, чем update поля, лучше использовать хранимую процедуру. В идеале, любое изменяющее действие над базой должно проходить через процедуру, а не напрямую в таблицы. Таким образом контролируется все валидные действия бизнес тайера и обеспечивается целостность.
Ну тут главное правильно их применять. Если бы они были бы ненужными и неэфективными, то не дашагали бы от других СУБД до мускла… А по поводу логики БД, тоесли триггер к месту, то лигика не запутается.
Хе-хе. Триггер суть реакция на изменение состояния таблицы. Читайте — событие.

А уж что в его теле происходит — логируется запрос, происходит какое-то обновление или фиг знает что ещё — дело десятое. Можно и хранимую процедуру позвать, дабы не нарушать целостность базы.

вопрос, как триггера будут отрабатывать при больших объемах:
скажем таблица ~3000000 записей, 10-30 инсертов в минуту + периодическая нагрузка селектами на таблицу.
Не могу найти в спеке, может кто подскажет :)
Можно в одном триггере иметь несколько евентов?
Что-то типа
CREATE TRIGGER `xxx` AFTER INSERT OR UPDATE ON `yyy`…
Интересная статья, а можно ли применить триггер если:
1. Мы имеем запись в базе данных (пользователя) с полем email.
2. При записи новой строки данных (пользователя) проверять, есть ли такой пользователь (с этим email) в базе данных с помощью триггера.
Это можно и без триггера реализовать.

Например, устанавливаем email как PRIMARY KEY или UNIQUE, и далее делаем INSERT IGNORE или REPLACE.
Only those users with full accounts are able to leave comments. Log in, please.