SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.02.2008 03:22:30

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Ошибка в триггере

Уважаемые коллеги , возникла проблема . После работы триггера  , не могу вставить данные в таблицу ( командой insert into tabl_name(...,....,...)values(...,...,...))
Появляется сообщение об ошибке :Error 1054 Unknown column `id` field list - Не удаётся найти колонку id .
До этого триггера  (по ходу  схемы ),подобные вышеупомянутые манипуляции с таблицей проходят без ошибок .

Подскажите как отловить ошибку в триггере , какие методы существуют .

Неактивен

 

#2 24.02.2008 03:32:17

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Ошибка в триггере

Самый простой способ - создать таблицу-лог и после каждой строчки в триггере вставлять информацию в лог. К сожалению дебаггер триггеров пока только в проекте.

Неактивен

 

#3 24.02.2008 04:28:17

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Ошибка в триггере

rgbeast написал:

Самый простой способ - создать таблицу-лог и после каждой строчки в триггере вставлять информацию в лог. К сожалению дебаггер триггеров пока только в проекте.

Т.е. , если я правильно понимаю, введя строку в триггер , далее необходимо попробывать вновь обратиться к требуемой таблице ( по которой возникает ошибка) insert into ...(...,...,...)values(...,...,...).  И посматреть , если команда проходит без ошибок , то до сих пор( до последней введённой строки) в триггере ошибок не было.  Так до тех пор , пока не найдём строку на которой появится ошибка

Я правильно  ВАС понял ???

Неактивен

 

#4 24.02.2008 09:51:53

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Ошибка в триггере

Ну можно и так - Вы привели второй способ. Я предлагал несколько другое - завести log-таблицу.

CREATE TABLE trigger_log (id INT auto_increment PRIMARY KEY, value TEXT, t TIMESTAMP);

Далее код триггера после каждой строчки добавить строку:
INSERT INTO trigger_log (value) VALUES ('I am at point 2'); -- здесь можно также записать инфу о переменных в триггере

Затем делаете, чтобы сработал триггер и после этого смотрите содержимое trigger_log

Неактивен

 

#5 25.02.2008 02:25:42

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Ошибка в триггере

rgbeast написал:

...Затем делаете, чтобы сработал триггер и после этого смотрите содержимое trigger_log

В том то и загвоздка , что триггер `twist` запускается на INSERT `joker`;по которой собственно и проблема ( Unknown kolumn `id` field list Error 1054)

Комменты к ниже приведённой схеме БД.
Данные из внешнего источника поступают в таблицу `joker` , затем после преобразований  обработанные данные поступают в `kuler` . Т.е. пытаясь проверить работоспособность скрипта я через insert into joker.(...,...,...)values(...,...,...) , пытался запустить скрипт  , может быть я не правильно запускаю свой скрипт ведь эти две таблицы завазаны между собой ?????
--
-- Create schema `DB`
--

CREATE DATABASE IF NOT EXISTS DB;
USE DB;

--
-- Definition of table `kuler`
--

DROP TABLE IF EXISTS `kuler`;
CREATE TABLE `kuler`(.`Sym`.,`DT`,`A`,`B`,`C`,..);
--
-- Definition of trigger `DD`
--


DELIMITER $$

CREATE DEFINER = `root`@`localhost` TRIGGER `DD` BEFORE UPDATE ON `kuler` FOR EACH ROW begin
    IF old.A >= new.A THEN
      set new.A = old.A;
    end if;

    IF old.B <= new.B THEN
      set new.B = old.B;
    end if;

    set new.C = old.C + new.C;
end $$

DELIMITER ;
--
-- Definition of table `joker`
--

DROP TABLE IF EXISTS `joker`;
CREATE TABLE `joker`(
`ID` int(10) unsigned NOT NULL auto_increment,
  `Sym` varchar(12) NOT NULL,
  `G` int(10) unsigned NOT NULL,
  `K` time NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=325014140 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;

--
-- Definition of trigger `twist`
--

DROP TRIGGER /*!50030 IF EXISTS */ `twist`;

DELIMITER $$

CREATE DEFINER = `root`@`localhost` TRIGGER `twist` BEFORE INSERT ON `joker` FOR EACH ROW begin

    declare barid int default 0;
    declare ts timestamp default Now();
    ....
    ....

Select timestamp(curdate(),maketime(hour(new.K),(minute(new.K) div 5)*5,00)) into ts;
select max(ID) into barid from kuler where Sym=new.Sym and DT=ts limit 1;
       IF barid>0 THEN

  update kuler set A=new.G, B=new.G, C=new.G,... where ID=barid;

       ELSE
  insert into kuler (... , ..., A, B, C, ...) VALUES(new.Sym, ts, new.G, new.G, new.G, ...,...);

       END IF;
end$$


DELIMITER ;

Неактивен

 

#6 25.02.2008 06:22:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5828

Re: Ошибка в триггере

Запускаете Вы правильно. Какая разница поступают ли данные из внешнего источника или Вы делаете команду INSERT INTO joker

Насколько я могу судить, глядя на код, ошибка заключается в том, что у таблицы kuler отсутствует поле id к которому идет обращение в триггере twist.
Что показывает проверка через log-таблицу?

Неактивен

 

#7 25.02.2008 23:02:38

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Ошибка в триггере

vasya написал:

....Насколько я могу судить, глядя на код, ошибка заключается в том, что у таблицы kuler отсутствует поле id к которому идет обращение в триггере twist.

В таблице kuler действительно отсутствует поле id ( пардон ID) .
В триггере twist я декларирую локальную переменную barid , затем select max(ID) into barid from kuler where Sym=new.Sym and DT=ts limit 1 - обращаюсь к последней строке в таблице joker;

vasya написал:

Что показывает проверка через log-таблицу?

В том то и загвоздка , что запуская триггер ( с вставленными строками  insert into trigger_log(...)values(...) после каждого запроса в триггере) через insert into joker  выдаётся сообщение об ошибке .

Я немного начинаю доганять , почему возникает такая проблема . У меня триггер twist запускается на BEFORE INSERT ON `joker` FOR EACH ROW begin (т.е. прежде!!! чем новая строка будет добавлена в таблицу ), а так же в  строке select max(ID) into barid from kuler where Sym=new.Sym and DT=ts limit 1 обращаюсь к последней(максимальной по ID) строке - а ведь последней (максимальной ) к которой обращается триггер -  у нас нет .
Ксовенное тому подтверждение - убрав из текста триггера select max(ID) into barid from kuler where Sym=new.Sym and DT=ts limit 1 и запустив триггер через insert into ...(...,...,...)values(...,...,...) ошибок нет и поля обеих таблиц заполняются нармально .

Неактивен

 

#8 25.02.2008 23:29:48

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5828

Re: Ошибка в триггере

Twix написал:

В том то и загвоздка , что запуская триггер ( с вставленными строками  insert into trigger_log(...)values(...) после каждого запроса в триггере) через insert into joker  выдаётся сообщение об ошибке .

Естественно ошибка по прежнему останется, но в таблице trigger_log появится несколько записей, по которым Вы сможете определить строку в которой произошла ошибка.


Twix написал:

В таблице kuler действительно отсутствует поле id ( пардон ID) .
В триггере twist я декларирую локальную переменную barid , затем select max(ID) into barid from kuler where Sym=new.Sym and DT=ts limit 1 - обращаюсь к последней строке в таблице joker;

Имена колонок не чувствительны к регистру.
Вы присваиваете переменной barid максимальное значение id из таблицы kuler, а в ней такого поля нет. На этом этапе выполнение триггера прекращается и выдается сообщение об ошибке.

Неактивен

 

#9 27.02.2008 01:33:27

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Ошибка в триггере

vasya написал:

...
Вы присваиваете переменной barid максимальное значение id из таблицы kuler, а в ней такого поля нет. На этом этапе выполнение триггера прекращается и выдается сообщение об ошибке.

!!! Странно , а мне казалось , что данный синтаксис ( SELECT col_name (...)INTO var_name (...) table_expr ) - сохраняет выбранные столбцы непосредственно в переменные ?!

Неактивен

 

#10 27.02.2008 02:38:20

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Ошибка в триггере

vasya написал:

... в таблице trigger_log появится несколько записей, по которым Вы сможете определить строку в которой произошла ошибка.

Таблица trigger_log показывает , что загвоздка в строке select max(ID) into barid from kuler where Sym=new.Sym and DT=ts limit 1; ( здесь мы сохраняем самое последнее - одно единственное значение столбца id в переменную barid .

!!! Но по моему ошибка ( Error 1054 Unknown column `id` field list ) возникает из-за того что триггер обращается к пустой колонке ???

Неактивен

 

#11 27.02.2008 12:09:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5828

Re: Ошибка в триггере

Twix написал:

!!! Странно , а мне казалось , что данный синтаксис ( SELECT col_name (...)INTO var_name (...) table_expr ) - сохраняет выбранные столбцы непосредственно в переменные ?!

Совершенно верно, только Вы пытаетесь выбрать несуществующий столбец.

Twix написал:

Таблица trigger_log показывает , что загвоздка в строке select max(ID) into barid from kuler where Sym=new.Sym and DT=ts limit 1; ( здесь мы сохраняем самое последнее - одно единственное значение столбца id в переменную barid .

Вот только столбца id в таблице kuler не существует.

Twix написал:

!!! Но по моему ошибка ( Error 1054 Unknown column `id` field list ) возникает из-за того что триггер обращается к пустой колонке ???

Если бы он (триггер) обратился к пустой колонке, то ошибки бы не возникло. Ошибка возникает оттого, что Вы обращаетесь к неизвестной серверу колонке id. А не известна она серверу, потому что её не существует.

Сделайте просто запрос SELECT id FROM kuler; и получите ту же ошибку (вместо id можно использовать любую послед. символов, не совпадающую с именами существующих колонок).

Неактивен

 

#12 28.02.2008 03:08:34

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Ошибка в триггере

Да , действительно . Добавил в таблицу недостающую колонку id и проблема решена .
Приношу БОЛЬШИЕ ИЗВЕНЕНИЯ за своё упрямство !!!

БЛАГОДАРЮ ЗА ПОМОЩЬ !!!

Отредактированно Twix (28.02.2008 03:37:03)

Неактивен

 

#13 28.02.2008 03:36:04

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Ошибка в триггере

Вы описали странное поведение. Триггер должен срабатывать на каждую вставленную строку, независимо от того, это несколько вставок или один множественный INSERT. Если такое поведение воспроизводится приведите код триггера, структуру таблиц и команду INSERT.

Неактивен

 

#14 28.02.2008 03:42:21

Twix
Завсегдатай
Зарегистрирован: 21.02.2008
Сообщений: 88

Re: Ошибка в триггере

Приношу свои извенения . Проблемная строка, после изменения в БД, судя по записям в логе отрабатывается нормально . Моя оплошность , не точно расшифровал записи в логе.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson