Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2013, 00:19   #1
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию Не работают триггеры.

Всем привет. Вопрос большей частью по MySQL. Есть таблица (`header`) с древовидной структурой (`id`,`id_header`,`name`). Написал триггер, который при удалении должен удалять дочерние элементы:
Код:
delimiter //
CREATE TRIGGER delete_header
BEFORE DELETE ON header FOR EACH ROW
BEGIN
DELETE FROM header WHERE id_header = OLD.id;
END;
//
delimiter ;
Делаю небольшой проект на локалке, использую Denwer. При попытке удаления - пишет ошибку:
Код:
Ошибка
SQL-запрос:

DELETE FROM  `help`.`header` WHERE  `header`.`id` =24

Ответ MySQL: 

#1436 - Thread stack overrun:  8416 bytes used of a 131072 byte stack, and 128000 bytes needed.  Use 'mysqld --thread_stack=#' to specify a bigger stack.
Подскажите какие настройки нужно изменить, я не понимаю. Запускал mysqld.exe - просто висит черное окно и ничего нельзя сделать. Надеюсь на вашу помощь.
Mr_freeman вне форума Ответить с цитированием
Старый 23.04.2013, 00:40   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

переводчика наймите
eval вне форума Ответить с цитированием
Старый 23.04.2013, 10:21   #3
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
переводчика наймите
Да я понял что нужно какой то параметр увеличить для стэка. А вот где и как я не знаю(
Mr_freeman вне форума Ответить с цитированием
Старый 23.04.2013, 10:49   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

неправильно поняли, вам надо понять почему у вас "Thread stack overrun"
eval вне форума Ответить с цитированием
Старый 23.04.2013, 11:29   #5
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
неправильно поняли, вам надо понять почему у вас "Thread stack overrun"
А какие могут быть причины? Я подумал что какой то параметр настроен неверно.
Mr_freeman вне форума Ответить с цитированием
Старый 23.04.2013, 11:51   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

такое часто может быть если есть рекурсия и она достаточно глубокая, ну или если она бесконечная то однозначно произойдет
у вас как я вижу тоже рекурсия, вот она достигает предела стэка, вам надо увеличить этот параметр (thread_stack вроде), тут вы правы, это я не туда смотрел , на сколько - тут сложно сказать, надо смотреть на данные, на сколько может идти рекурсия .. посмотрите сколько оно сейчас
eval вне форума Ответить с цитированием
Старый 23.04.2013, 16:31   #7
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Очень странно, рекурсия была всего на один уровень вложенности.. Ну да ладно, изменил я все таки этот параметр. Теперь ошибка такая:
Код:
SQL-запрос:

DELETE FROM  `help`.`header` WHERE  `header`.`id` =24

Ответ MySQL: 

#1442 - Can't update table 'header' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Пока особо еще не разбирался, но может вы сталкивались с таким?
Mr_freeman вне форума Ответить с цитированием
Старый 23.04.2013, 19:35   #8
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

MySQL не поддерживает рекурсивные триггеры (может кто и поправит .. может есть параметр в новых версиях ... ). В MSSQL насколько я знаю, такой параметр есть.
В вашей ситуации сделайте поле id_header в качестве внешнего ключа на `id` и пропишите ему ON DELETE CASCADE
А вообще в таких ситуациях пишите хранимые процедуры
Cronos20 вне форума Ответить с цитированием
Старый 24.04.2013, 09:13   #9
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от Cronos20 Посмотреть сообщение
MySQL не поддерживает рекурсивные триггеры (может кто и поправит .. может есть параметр в новых версиях ... ). В MSSQL насколько я знаю, такой параметр есть.
В вашей ситуации сделайте поле id_header в качестве внешнего ключа на `id` и пропишите ему ON DELETE CASCADE
А вообще в таких ситуациях пишите хранимые процедуры
А в хранимой процедуре можно сделать рекурсию?
Mr_freeman вне форума Ответить с цитированием
Старый 24.04.2013, 10:06   #10
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Так а чем каскад не угодил?
eval вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
триггеры brans SQL, базы данных 1 14.12.2011 10:18
Триггеры JoyStick 0_o Помощь студентам 4 01.06.2011 12:13
Триггеры JoyStick 0_o SQL, базы данных 0 01.06.2011 10:24
Триггеры МартинИ SQL, базы данных 4 23.12.2010 20:12
генератор поля, не работают триггеры delphi Domanoff БД в Delphi 4 07.04.2010 21:40