Не создаётся триггер (MySQL 5.0.51a-3ubuntu5.1)

iSlayter

Новичок
Не создаётся триггер (MySQL 5.0.51a-3ubuntu5.1)

Код:
CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = OLD.id;
   END;

CREATE TRIGGER `artists_litera_autoinsert` after insert ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = NEW.id;
   END;
Текст ошибки:
#1064 - 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 '' at line 3
Подскажите, пожалуйста, что я делаю не так? Или хотя бы объясните о какой ошибке говорит MySQL сервер? Ответ просто до безобразия избыточен :)

UPD: забыл сказать, что в интернетах вычитал, что для создания триггеров в MySQL < 5.1.6 необходимо быть супер-пользователем. На локальному компе стоит 5.0.45, из под рута пробовал создавать эти триггеры, результат тот же (та же ошибка в ответе).
 

iSlayter

Новичок
Уже пытался.

Запрос:
Код:
DELIMITER |
   CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
      FOR EACH ROW BEGIN
         UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = OLD.id;
      END;
|
Ответ:
#1064 - 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 'DELIMITER |
CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_' at line 1
 

Dl

Новичок
То есть в командной строке ругается на DELIMITER |
?
 

Dl

Новичок
Ну не знаю, как через phpmyadmin, но такие варианты работают:
PHP:
$query = 'CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = OLD.id;
   END;';
$mysqli->query($query);

$query = 'CREATE TRIGGER `artists_litera_autoinsert` after insert ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = NEW.id;
   END;';
$mysqli->query($query);

$query = 'CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = OLD.id;
   END;

CREATE TRIGGER `artists_litera_autoinsert` after insert ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = NEW.id;
   END;';
$mysqli->multi_query($query);
 

Beavis

Banned
через phpMyAdmin вряд ли такое получится... он не любит все эти процедуры, триггеры и т.д...
 

iSlayter

Новичок
Окей, исполнил запросы через консоль.

Вопрос - как можно триггеры создавать без рутовских полномочий?
 

A1x

Новичок
для mysql-5.0 никак похоже. как-то даже пришлось отказаться от триггеров
 

prolis

Новичок
так правильней
[sql]
CREATE TRIGGER `artists_litera_autoupdate` BEFORE update ON `cms_artists` or BEFORE INSERT ON `cms_artists`
FOR EACH ROW
SET NEW.`litera` = substring(NEW.name, 0, 1);
[/sql]
 

iSlayter

Новичок
Ребята, большое спасибо за дискуссию!

-~{}~ 04.06.09 21:01:

ан нет, не прошёл предложенный prolis'ом запрос :(

Код:
mysql> CREATE TRIGGER `artists_litera_autoupdate` BEFORE UPDATE ON `cms_artists` OR BEFORE INSERT ON `cms_artists`
    -> FOR EACH
    -> ROW
    -> SET NEW.`litera` = substring(NEW.name, 0, 1 ) ;
ERROR 1064 (42000): 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
'OR BEFORE INSERT ON `cms_artists`
FOR EACH
ROW
SET NEW.`litera` = substring(NEW.' at line 1
что не так?

-~{}~ 04.06.09 21:07:

Блин, даже если два триггера создавать то запрос проходит как бы успешно, но на самом деле ничего не меняет в `information_schema`.`TRIGGERS` пустота :(
Код:
mysql>  DELIMITER $$
mysql> CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
    -> FOR EACH ROW BEGIN
    ->    UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = OLD.id;
    -> END;
    ->
    -> CREATE TRIGGER `artists_litera_autoinsert` after insert ON `cms_artists`
    -> FOR EACH ROW BEGIN
    ->    UPDATE `cms_artists` SET `litera` = substring(NEW.name, 0, 1) WHERE `id` = NEW.id;
    -> END;
    -> $$
Query OK, 0 rows affected (0.06 sec)

Query OK, 0 rows affected (0.06 sec)
-~{}~ 04.06.09 21:11:

Хотя если потом исполнить для одного триггера отдельно (artists_litera_autoupdate) то MySQL отвечает:
ERROR 1235 (42000): This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'
т.е. триггер таки есть, но он не отрабатывает нужным образом и отсутствует в information_schema!

-~{}~ 04.06.09 21:17:

Так это ещё и не всё! :)

Код:
INSERT INTO `klipz`.`cms_artists` (`name`) VALUES ('yabidabidudududu')
Ответ MySQL:
#1442 - Can't update table 'cms_artists' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
-~{}~ 04.06.09 22:47:

Удалил триггеры, добавил только для обновления. Чето нифига не изменяется содержимое поля litera после обновления

-~{}~ 04.06.09 22:50:

Всё равно не понимаю. Триггер вроде бы успешно создался, при show triggers он показывается а в information_schema его нет. А вроде как должен быть. Ведь так?
[q]mysql> CREATE TRIGGER `artists_litera_autoupdate` AFTER UPDATE ON `cms_artists`
-> FOR EACH ROW BEGIN
-> UPDATE `cms_artists` SET `litera` = substring(NEW.`name`, 0, 1) WHERE `id` = NEW.`id`;
-> END;
-> $$
Query OK, 0 rows affected (0.01 sec)

mysql> show triggers$$
+--------------+--------+-------------+---------------------+--------+---------+----------+----------------+
| Trigger | Event | Table | Statement | Timing |Created| sql_mode | Definer |
+--------------+--------+-------------+---------------------+--------+---------+----------+----------------+
| artists_litera_autoupdate | UPDATE | cms_artists | BEGIN
UPDATE `cms_artists` SET `litera` = substring(NEW.`name`, 0, 1) WHERE `id` = NEW.`id`;
END | AFTER | NULL | | root@localhost |
+---------------+--------+-------------+---------------------+--------+---------+----------+----------------+
1 row in set (0.00 sec)

[/q]

Код:
SELECT *
FROM `TRIGGERS`
LIMIT 0 , 30
[q]MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0185 sec )[/q]
 

Dl

Новичок
не прошёл предложенный prolis'ом запрос
И не должен
даже если два триггера создавать то запрос проходит как бы успешно
Это похоже больше на шаманство, чем на осмысленные действия. Почему между END; и CREATE нету $$ ?
#1442 - Can't update table 'cms_artists' in stored function/trigger because it is already used by statement which invoked this stored function/trigger
http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html
Within a stored function or trigger, it is not permitted to modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger
 

iSlayter

Новичок
Клааааааааасссс!

Я целый день впустую потратил. Г..споди, какой кошмар :( дурак блин, мануалы читать надо было сначала.

Итак, тогда переформулирую вопрос: мне необходимо каким-то образом иметь в базе данных актуальную информацию в виде поле `litera` типа char, которое будет содержать первый символ поля `name`, типа varchar. Решил что триггеры идеально подойдут для моего случая.

Есть ли какой-нибудь другой способ реализовать задуманное мной средствами MySQL?
 

Dl

Новичок
Ну если принципиально триггером, то вот так:
set new.`litera`=substring(new.`name`, 1, 1)
 

iSlayter

Новичок
так ничего не изменилось-то, так же не даёт ничего сделать. черт, целый день зря потратил. сеня с утра в скрипты заложил етот функционал..
 

iSlayter

Новичок
Создавал такой триггер:
Код:
CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
   FOR EACH ROW BEGIN
      UPDATE `cms_artists` set new.`litera`=substring(new.`name`, 1, 1) WHERE `id` = NEW.`id`;
   END;
и затем, при апдейте вываливалось таже самая ошибка:
#1442 - Can't update table 'cms_artists' in stored function/trigger because it is already used by statement which invoked this stored function/trigger
Если я правильно понял цитату с mysql.com выше, то получается, что в моём случае, триггеры использовать невомзожно.
 

iSlayter

Новичок
Уже смешно, честно :)

Код:
mysql> delimiter $$
mysql> CREATE TRIGGER `artists_litera_autoupdate` after update ON `cms_artists`
    ->  FOR EACH ROW BEGIN
    ->     set new.`litera`=substring(new.`name`, 1, 1);
    ->  END;
    -> $$
ERROR 1362 (HY000): Updating of NEW row is not allowed in after trigger
:D
 
Сверху