Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Триггеры (Triggers) в MySQL  (Прочитано 14681 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« : 01-11-2006 13:27 » 

Стоит задача - проверить данные перед вводом (insert, update) и если данные не корректные - отменить комманду. Как это можно сделать в MySQL?
Мне казалось что можно решить это с помощью триггеров, но не могу найти как...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 01-11-2006 19:18 » 

Kivals, тригеры поддерживаются в 5.0 и выше.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 02-11-2006 09:03 » 

Я знаю. У меня как раз 5.0 - т.е. например записать что-то в другую таблицу в триггере я могу (типа лог вести), а вот отменить ввод данных, если что-то не так, - нет Жаль
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #3 : 02-11-2006 09:33 » 

а вызвать исключение в MySQL можно?
Записан

Удачного всем кодинга! -=x[PooH]x=-
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 02-11-2006 10:08 » 

Пытался через нечто похожее. Не решает задачу на 100%:
я пытался так:
CREATE TABLE `TestTrigger` (
    `id` int(10) NOT NULL auto_increment,
    `name` varchar(10) NOT NULL default '',
    PRIMARY KEY  (`id`),
    UNIQUE KEY `id` (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

DELIMITER |

CREATE TRIGGER TestTrigger_bi BEFORE INSERT ON TestTrigger
    FOR EACH ROW BEGIN
      IF NEW.name LIKE '%xxx%' THEN
        SET NEW.name=NULL;
      END IF;
    END|

К сожалению тогда при запросе на вставку нескольких строк
INSERT INTO `TestTrigger` (name)
    VALUES ('*1*'), ('*2*'), ('*3*'), ('*xxx*');
не вставляются ничего, а хотелось бы чтобы *1*,*2*,*3* вставились...

хотя может это и правильно - идет отмена всей транзакции...
но может есть более гибкое решение?

да и приходится для каждой таблицы придумывать условие исключения
« Последнее редактирование: 17-12-2007 16:56 от Алексей1153++ » Записан
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 02-11-2006 10:11 » 

А еще бы - вернуть как-то идентификатор (или строку) ошибки (причины невставляния)... Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 02-11-2006 17:51 » 

Цитата
MySQL handles errors during trigger execution as follows:
• If a BEFORE trigger fails, the operation on the corresponding row is not performed.
• An AFTER trigger is executed only if the BEFORE trigger (if any) and the row operation both
execute successfully.
• An error during either a BEFORE or AFTER trigger results in failure of the whole statement that
caused trigger invocation.
• For transactional tables, failure of a trigger (and thus the whole statement) should cause rollback
of all changes performed by the statement. For non-transactional tables, such rollback cannot be
done, so although the statement fails, any changes performed prior to the point of the error remain
in effect.
Т.е. вызвать ошибку будет логично.
Мне с MySQL5.0 так и не удалось толком поработать, по сему не могу дать точного совета.
Попробуй объявить переменную с NOT NULL, а потом присвоить ей NULL - может это будет удобнее.
Свою ошибку вернуть врятли удастся, а зафиксировать можно: сделать запись в табличку формата MyISAM - транзакции она не поддерживает.
Не проверял, можно ли в тригере объявить DECLARE ... HANDLER ?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 03-11-2006 08:03 » 

Спасибо! Про NOT NULL - у меня в примере как раз так и сделано (см. выделение жирным)
DECLARE ... HANDLER не проверял - щас посмотрю...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines