Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];

Вниз

Ошибка в триггере MySQL   Найти похожие ветки 

 
mefodiy   (2008-08-30 21:32) [0]

В таблицы MySQL добавлены "служебные" поля, в которые записываю имя пользвателя, компьютера, дату, время обновления и т.д.  Конечно, можно записывать все это в самой программе, но, мне кажется, в триггере это было бы  компактнее и правильнее.
Создал такой триггер:
CREATE TRIGGER MyPersonalInsert AFTER UPDATE ON Personal FOR EACH ROW
 BEGIN
   UPDATE MyTable SET
      AddDate=...,  
      AddTime=...,  
      AddCompName=...,
      AddUserName=...,
      LastEditDate=...,
      LastEditTime=...,
      LastEditCompName=...,
      LastEditUserName=...;
 END;
"Задача" триггера при обновлении строки "на лету" заполнить "служебные поля.
Но при обновление какого-либо поля (не из числа перечисленных выше) таблицы MyTable появляется ошибка "Can"t update table MyTable in trigger because it is already uses by statement which invoked this trigger"
Перепробовал разные варианты BEFORE UPDATE, NEW.AddDate,OLD.AddDate - то же самое.
Попробовал создать процедуру и в триггере вызывать ее. Та же ошибка.
Как можно решить проблему?
Пасибо.


 
Правильный$Вася   (2008-08-30 22:18) [1]

ну и каша у тебя в голове
тебе же ясно написано "нельзя обновить таблицу, изменение в которой вызвало срабатывание триггера"
поля менять нужно before update, хотя не ясно, зачем в триггере на одну таблицу изменять поля в другой, если ты пытаешься использовать конструкции "Old...."
опиши четко, что делаешь, сколькои какие таблиц меняешь и по какой бизнес-логике


 
mefodiy   (2008-08-31 11:26) [2]

>зачем в триггере на одну таблицу изменять поля в другой
Я изменяю несколько полей той же таблицы, а не другой. Пробовал делать это в триггере BEFORE UPDATE вот так
CREATE TRIGGER MyPersonalInsert BEFORE UPDATE ON Personal FOR EACH ROW
BEGIN
  UPDATE MyTable SET
     OLD.AddDate=...,  
     OLD.AddTime=...,  
     OLD.AddCompName=...,
     OLD.AddUserName=...,
     OLD.LastEditDate=...,
     OLD.LastEditTime=...,
     OLD.LastEditCompName=...,
     OLD.LastEditUserName=...;
END;
Но возникает та же ошибка.


 
Правильный$Вася   (2008-08-31 18:58) [3]


> Я изменяю несколько полей той же таблицы, а не другой

да ну?
а почему BEFORE UPDATE ON Personal, а UPDATE MyTable SET ?
PS
учи синтаксис применения old


 
mefodiy   (2008-08-31 20:46) [4]

Прошу прощения. Вношу исправление:
CREATE TRIGGER MyTableInsert BEFORE UPDATE ON MyTable FOR EACH ROW
BEGIN
  UPDATE MyTable SET
    OLD.AddDate=...,  
    OLD.AddTime=...,  
    OLD.AddCompName=...,
    OLD.AddUserName=...,
    OLD.LastEditDate=...,
    OLD.LastEditTime=...,
    OLD.LastEditCompName=...,
    OLD.LastEditUserName=...;
END;
END;


 
Правильный$Вася   (2008-08-31 21:28) [5]


>  Вношу исправление:

а теперь читай про old, чтоб не было болезненных фантазий
PS
а второй END для чего?


 
mefodiy   (2008-09-01 08:53) [6]

Второй END, конечно, не нужен и вместо OLD должно быть NEW.
Но ведь и этот вариант не работает:
CREATE TRIGGER MyTableInsert BEFORE UPDATE ON MyTable FOR EACH ROW
BEGIN
 UPDATE MyTable SET
   NEW.AddDate=...,  
   NEW.AddTime=...,  
   NEW.AddCompName=...,
   NEW.AddUserName=...,
   NEW.LastEditDate=...,
   NEW.LastEditTime=...,
   NEW.LastEditCompName=...,
   NEW.LastEditUserName=...;
END;


 
Правильный$Вася   (2008-09-01 11:04) [7]

подсказка номер "последняя", все равно думать не желаешь
читай справку, как именно применяется new, там и примеры должны быть


 
mefodiy   (2008-09-01 13:17) [8]

Угроза о "последней" подсказке подействовала.
Вот вариант, который заработал:
CREATE TRIGGER MyTableInsert BEFORE UPDATE ON MyTable FOR EACH ROW
BEGIN
 SET NEW.AddDate=...,  
 SET NEW.AddTime=...,  
 SET NEW.AddCompName=...,
 SET NEW.AddUserName=...,
 SET NEW.LastEditDate=...,
 SET NEW.LastEditTime=...,
 SET NEW.LastEditCompName=...,
 SET NEW.LastEditUserName=...;
END;



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.005 c
15-1234977774
vrem
2009-02-18 20:22
2009.04.26
Верить или не верить?


15-1235328760
KilkennyCat
2009-02-22 21:52
2009.04.26
Музыка из 30-х..70-х годов


15-1235546556
Ega23
2009-02-25 10:22
2009.04.26
Администраторам сайта


2-1237106993
ML
2009-03-15 11:49
2009.04.26
Процедуры


2-1236602322
DL
2009-03-09 15:38
2009.04.26
Логические выражения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский