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


Автор: FortMax 12.11.2009, 04:35
Доброго времени суток !
В качестве среды использую dbForge Studio for MySQL. В БД есть табличка для регистрации пользователей, дата регистрации вставляется через триггер такого вида 
Код
CREATE 
    DEFINER = 'root'@'localhost'
TRIGGER dbMessBox.Ins_Registr_Date
    BEFORE INSERT
    ON dbMessBox.tUsers
    FOR EACH ROW
BEGIN
  UPDATE
    dbmessbox.tUsers
  SET
    dbmessbox.tUsers.Registr_Day = (SELECT NOW())
  WHERE
    dbmessbox.tUsers.ID_User = inserted.ID_User;
      
    END


при попытке добавить данные в среда происходит ошибка 
Код

Can't update table 'tusers' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.


Может кто знает в чем проблема ???
з.ы. ещё у меня сомнения по поводу обьекта inserted, есть ли такой в My, я его взял из MS SQL ?

Автор: zav74 12.11.2009, 13:58
Вместо inserted надо NEW.

Автор: FortMax 13.11.2009, 01:13
пробовал, та же ошибка

Автор: zav74 13.11.2009, 11:09
Так ты же в триггере обновляешь ту же таблицу, к какой триггер привязан. Вроде ошибка в этом. 
Да и вообще у меня вроде не получилось сделать BEFORE INSERT, пришлось AFTER INSERT.

Автор: FortMax 16.11.2009, 01:08
т.е. тригер пытается обновить не существующую запись !?

Автор: pp2amd6 16.11.2009, 17:12
А почему бы просто не написать 
BEGIN
     SET dbmessbox.tUsers.Registr_Day = NOW();
END

???

Автор: zav74 16.11.2009, 18:32
Цитата

т.е. тригер пытается обновить не существующую запись !?


И это тоже, но в этом случае бы не было ошибки, просто бы не обновилась запись. Но если перести с английского текст ошибки-"не может обновить таблицу 'tusers' в триггере, потому что она уже используется." Триггер сработал на этой же таблице-наверно это критично.

Автор: FortMax 17.11.2009, 01:13
pp2amd6,  а это будет для какой записи в таблице !?

а если я буду производить вставку из пхп-скрипта, такой ошибки не будет ???

Автор: sir_nuf_nuf 17.11.2009, 11:19
Цитата(zav74 @  16.11.2009,  18:32 Найти цитируемый пост)
Триггер сработал на этой же таблице-наверно это критично

Это точно критично по крайней мере для MySQL.
Нельзя из триггера обновлять таблицу на которой он и висит.

Вам нужен такой триггер.
Код

CREATE 
    DEFINER = 'root'@'localhost'
TRIGGER dbMessBox.Ins_Registr_Date
    BEFORE INSERT
    ON dbMessBox.tUsers
    FOR EACH ROW
BEGIN
    NEW.Registr_Day = NOW();
END


В момент вызова NEW - указывает "новое значение строки". 

Автор: FortMax 18.11.2009, 08:27
sir_nuf_nuf,  выдает ошибку
Код
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.Registr_Day =NOW();
END' at line 8


???

Автор: pp2amd6 18.11.2009, 10:09
FortMax
Код

    set NEW.Registr_Day = NOW();

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