Задавайте вопросы, мы ответим
Вы не зашли.
Уважаемые коллеги , возникла проблема . После работы триггера , не могу вставить данные в таблицу ( командой insert into tabl_name(...,....,...)values(...,...,...))
Появляется сообщение об ошибке :Error 1054 Unknown column `id` field list - Не удаётся найти колонку id .
До этого триггера (по ходу схемы ),подобные вышеупомянутые манипуляции с таблицей проходят без ошибок .
Подскажите как отловить ошибку в триггере , какие методы существуют .
Неактивен
Самый простой способ - создать таблицу-лог и после каждой строчки в триггере вставлять информацию в лог. К сожалению дебаггер триггеров пока только в проекте.
Неактивен
rgbeast написал:
Самый простой способ - создать таблицу-лог и после каждой строчки в триггере вставлять информацию в лог. К сожалению дебаггер триггеров пока только в проекте.
Т.е. , если я правильно понимаю, введя строку в триггер , далее необходимо попробывать вновь обратиться к требуемой таблице ( по которой возникает ошибка) insert into ...(...,...,...)values(...,...,...). И посматреть , если команда проходит без ошибок , то до сих пор( до последней введённой строки) в триггере ошибок не было. Так до тех пор , пока не найдём строку на которой появится ошибка
Я правильно ВАС понял ???
Неактивен
Ну можно и так - Вы привели второй способ. Я предлагал несколько другое - завести 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
Неактивен
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 ;
Неактивен
Запускаете Вы правильно. Какая разница поступают ли данные из внешнего источника или Вы делаете команду INSERT INTO joker
Насколько я могу судить, глядя на код, ошибка заключается в том, что у таблицы kuler отсутствует поле id к которому идет обращение в триггере twist.
Что показывает проверка через log-таблицу?
Неактивен
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(...,...,...) ошибок нет и поля обеих таблиц заполняются нармально .
Неактивен
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, а в ней такого поля нет. На этом этапе выполнение триггера прекращается и выдается сообщение об ошибке.
Неактивен
vasya написал:
...
Вы присваиваете переменной barid максимальное значение id из таблицы kuler, а в ней такого поля нет. На этом этапе выполнение триггера прекращается и выдается сообщение об ошибке.
!!! Странно , а мне казалось , что данный синтаксис ( SELECT col_name (...)INTO var_name (...) table_expr ) - сохраняет выбранные столбцы непосредственно в переменные ?!
Неактивен
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 ) возникает из-за того что триггер обращается к пустой колонке ???
Неактивен
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 можно использовать любую послед. символов, не совпадающую с именами существующих колонок).
Неактивен
Да , действительно . Добавил в таблицу недостающую колонку id и проблема решена .
Приношу БОЛЬШИЕ ИЗВЕНЕНИЯ за своё упрямство !!!
БЛАГОДАРЮ ЗА ПОМОЩЬ !!!
Отредактированно Twix (28.02.2008 03:37:03)
Неактивен
Вы описали странное поведение. Триггер должен срабатывать на каждую вставленную строку, независимо от того, это несколько вставок или один множественный INSERT. Если такое поведение воспроизводится приведите код триггера, структуру таблиц и команду INSERT.
Неактивен
Приношу свои извенения . Проблемная строка, после изменения в БД, судя по записям в логе отрабатывается нормально . Моя оплошность , не точно расшифровал записи в логе.
Неактивен