Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Триггер на удаление


Автор: aliks 26.10.2009, 18:15
Есть 2 связанные таблицы, в одной из таблиц хочу написать триггер, который перед удалением строки будет производить проверку, если в связанной таблице записи, есть ли на удаляемою запись ссылка. Если ссылка есть, то хочу чтобы удаление не производилось, а выдавалась какое либо предупреждение. Вот пример моего триггера.

Код

CREATE TRIGGER database1.obj_param_value_del
BEFORE DELETE ON database1.object_param_value
FOR EACH ROW
BEGIN
  DECLARE cnt INT;

  SET cnt = (SELECT COUNT(*) FROM objects_params
  WHERE obj_param_value_id = old.id);
  IF cnt > 0 THEN
    ????
  END


Нечто подобное я делал в MSSQL следующим образом

Код

begin
    SET @er='Невозможно удалять документы с помощью незарегистрированного приложения  '+app_name()
    RAISERROR(@er, 16, -1)
        ROLLBACK TRANSACTION
end


Но вот как это реализовать в MySQL  я не знаю

Добавлено через 8 минут и 40 секунд
Решение нашел при использовании связей, поставил в RESTRICT.
А можно ли все таки решить это на триггере?

Автор: DimW 27.10.2009, 09:49
Цитата(aliks @  26.10.2009,  18:15 Найти цитируемый пост)
 выдавалась какое либо предупреждение

а предупреждения самого сервера бужет достаточно: обнаружина порожденная запись, невозможно удалить строку! (что то типа того...)?
если достаточно, то натяните primary key и foreign key и будет вам счастье.

Автор: Akina 27.10.2009, 10:21
Цитата(aliks @  26.10.2009,  19:15 Найти цитируемый пост)
как это реализовать в MySQL  я не знаю

Смотря какая версия мускула. SIGNAL/RESIGNAL - только в шестой версии.

Автор: Zloxa 27.10.2009, 10:49
Цитата(aliks @  26.10.2009,  18:15 Найти цитируемый пост)
Вот пример моего триггера.

Откройте для себя foreign key.

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

Автор: DimW 27.10.2009, 11:15
Цитата(Zloxa @  27.10.2009,  10:49 Найти цитируемый пост)
если я правильно поинмаю что это оракля


Zloxa, ты в форуме по мускулу  smile 

Автор: Zloxa 27.10.2009, 11:54
Цитата(DimW @  27.10.2009,  11:15 Найти цитируемый пост)
ты в форуме по мускулу   

Но в качестве примера для иллюстрации задачи приведен код для оракла, который не корректен.

Автор: Zloxa 27.10.2009, 12:27
Хотя, не, гоню, какой же это оракл?

aliks, для какой платформы первый пример?

Автор: aliks 19.11.2009, 10:25
Цитата(Zloxa @  27.10.2009,  12:27 Найти цитируемый пост)
aliks, для какой платформы первый пример? 


Для MySQL, мы в каком разделе?

foreign key это конечно хорошо...а если мне надо сделать так...


Код

CREATE TRIGGER database1.obj_param_value_del
BEFORE DELETE ON database1.object_param_value
FOR EACH ROW
BEGIN
   IF old.id =10 THEN
      ???   УДАЛЕНИЕ НЕ ПРОИЗВОДИТЬ!!!
END


Автор: Zloxa 19.11.2009, 12:24
Цитата(aliks @  19.11.2009,  10:25 Найти цитируемый пост)
а если мне надо сделать так...

Это плохо если так надо, но если все таки надо, foreign key никоим образом не препятствует созданию триггеров. Просто, по меньшей мере, не целесообразно триггер наполнять функционалом, который реалзиует функционал FK, только делает это хуже.

Автор: aliks 19.11.2009, 13:16
Хорошо, давайте предположим, что у меня таблица не связана с другой, одна единственная....
Так что получается, на триггере нельзя реализовать препятствие для удаления строки определенного значения???

Только что нарыл в инете по теме http://sqlinfo.ru/forum/viewtopic.php?id=946

Автор: zav74 19.11.2009, 14:33
Цитата

Это плохо если так надо, но если все таки надо, foreign key никоим образом не препятствует созданию триггеров. Просто, по меньшей мере, не целесообразно триггер наполнять функционалом, который реалзиует функционал FK, только делает это хуже.


А почему плохо. Один раз я даже так сделал(только триггер должен срабатывать ВМЕСТО удаления). Вместо удаления иногда активизировал пустой триггер-таким образом запрещал удаление  из любого инструмента. Но это было в другой СУБД, жаль если здесь нет такого инструмента.

Автор: aliks 19.11.2009, 18:06
Цитата(zav74 @  19.11.2009,  14:33 Найти цитируемый пост)
Но это было в другой СУБД, жаль если здесь нет такого инструмента


В том то и дело что у других баз есть такой инструмент

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)