SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 25.11.2009 22:22:19

Temi4
Участник
Зарегистрирован: 25.11.2009
Сообщений: 12

Помогите написать триггер

Писал триггеры под MSSQL, там было просто, а здесь не могу разобратся...
Помогите плз как мне написать триггер с такими параметрами без ошибки?
CREATE TRIGGER insert_titles AFTER INSERT ON dle_titles
FOR EACH ROW BEGIN
IF( new.id_page IN (SELECT id_page FROM  dle_titles WHERE categori = new.categori) ) then
begin
RAISERROR('Uge est', 16, -1)
ROLLBACK TRANSACTION
end
end if
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 '('Uge est', 16, -1)
ROLLBACK TRANSACTION
end
end if
END' at line 5

триггер добавляю через phpmyadmin

Отредактированно Temi4 (25.11.2009 22:29:41)

Неактивен

 

#2 26.11.2009 00:19:42

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

Re: Помогите написать триггер

Ошибка возникает потому, что команды RAISERROR в MySQL не существует.
Никогда не пользовался MSSQL, поэтому не могу понять, что именно вам необходимо.

Однако могу сразу сказать, что существующие в MySQL ограничения http://dev.mysql.com/doc/refman/5.0/en/ … tions.html не позволят вам выполнить ваш замысел:
" For stored functions (but not stored procedures), the following additional statements or operations are disallowed:
      Statements that perform explicit or implicit commit or rollback. Support for these statements is not required by the SQL standard, which states that each DBMS vendor may decide whether to allow them.
"

В данном вам придется использовать хранимые процедуры.

Неактивен

 

#3 26.11.2009 00:35:36

Temi4
Участник
Зарегистрирован: 25.11.2009
Сообщений: 12

Re: Помогите написать триггер

RAISERROR - возвращает желаемую информацию об ошибке при добавление при срабатывание тригера.

те получается, мы пишем тригер и в нем вызываем процедуру, которая будет проверять условие и делать добавление в таблицу если выполнено условие? или как должно все происходить?

Спасибо за быстрый ответ

а new.значение - это те значения которые мы передаем при Insert? как раз на то событие которое срабатывает тригер?
в Мс - это была таблица inserted просто... экзам сдавать... а я решил переучится с мс на mesql)

Отредактированно Temi4 (26.11.2009 00:37:54)

Неактивен

 

#4 26.11.2009 00:47:27

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

Re: Помогите написать триггер

Из триггера вызвать процедуру нельзя. sad
В данном случае придется писать процедуру с помощью которой проверять условие и делать добавление в таблицу, если условие выполнено. Тригерры здесь никак использоваться не будут.

Temi4 написал:

а new.значение - это те значения которые мы передаем при Insert? как раз на то событие которое срабатывает тригер?

Да.

Неактивен

 

#5 26.11.2009 23:16:22

Temi4
Участник
Зарегистрирован: 25.11.2009
Сообщений: 12

Re: Помогите написать триггер

а для каких моментов тогда в mysql используются тригеры?

Неактивен

 

#6 27.11.2009 03:41:10

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

Re: Помогите написать триггер

Как правило для проверок или вычислений над изменяемыми или вставляемыми в таблицу значениями.

Неактивен

 

#7 27.11.2009 07:35:54

Temi4
Участник
Зарегистрирован: 25.11.2009
Сообщений: 12

Re: Помогите написать триггер

Спасибо тогда мне надо написать такой триггер:
Вставляем в таблицу запись, которую проверяем на условие, чтобы она не повторялась по id_page. Если не повторяется вставляем, если повторяется возвращаем сообщение об ошибки.
Как это реализовать на mysql хотя бы примерные штрихи.

БУду оч благодарен.

Неактивен

 

#8 30.11.2009 20:51:35

Temi4
Участник
Зарегистрирован: 25.11.2009
Сообщений: 12

Re: Помогите написать триггер

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

CREATE TRIGGER ins_check AFTER INSERT ON dle_titles
FOR EACH ROW
BEGIN
call simpleproc(new.id_page)
END



CREATE PROCEDURE simpleproc (IN id_pg INT)
BEGIN
DECLARE xid INT
SELECT COUNT(id_page) INTO xid FROM dle_titles where id_page=id_pg
IF(xid>1) THEN
ROLLBACK
END IF
END

процедура не компилируется в пхпмайадмине объясните почему плз???
Во всех пособиях по скуль используется ';' - как разделитель, но если его использовать в пхпмайадмине, то выполняется строка только до ';'.
Да кстати ругается на: d_page=id_pg IF(xid>1)

Буду оч благодарен за помощь

Неактивен

 

#9 02.12.2009 15:02:21

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите написать триггер

Ну, не компилируется, потому что нет точек с запятыми посередине.
Как делать в phpmyadmin другой разделитель — науке не известно,
но можете попробовать поискать smile

Возможно, стандартное «DELIMITER ;;» отработает нормально.

Неактивен

 

#10 02.12.2009 17:17:46

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Помогите написать триггер

Temi4 написал:

Спасибо тогда мне надо написать такой триггер:
Вставляем в таблицу запись, которую проверяем на условие, чтобы она не повторялась по id_page. Если не повторяется вставляем, если повторяется возвращаем сообщение об ошибки.
Как это реализовать на mysql хотя бы примерные штрихи.

БУду оч благодарен.

А может просто уникальный ключ на "id_page"?

Неактивен

 

#11 02.12.2009 21:32:13

Temi4
Участник
Зарегистрирован: 25.11.2009
Сообщений: 12

Re: Помогите написать триггер

vaspet написал:

А может просто уникальный ключ на "id_page"?

да мне преподавателю сдать надо smile так бы можно было как нибудь выкрутится.
Спасибо за идею).

paulus, спасибо попробую

Неактивен

 

#12 02.12.2009 22:14:56

Temi4
Участник
Зарегистрирован: 25.11.2009
Сообщений: 12

Re: Помогите написать триггер

так как выполнить разобрался)) ставим % в конце триггера а в поле разделитель пхпмайадмина ставим % и все процедуру создал а вот с триггером косяк
#1227 - Access denied; you need the SUPER privilege for this operation - сделал для пользователя бд под которым вхожу команду гранд, но не помогло...

Неактивен

 

#13 03.12.2009 12:07:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите написать триггер

После GRANT нужно еще и перелогиниться.

Неактивен

 

#14 03.12.2009 23:28:40

Temi4
Участник
Зарегистрирован: 25.11.2009
Сообщений: 12

Re: Помогите написать триггер

спасибо но хостер прав не давал на грант выпросил создал тригер.
только такая проблема при добавление возникает ошибка вида
1422: Explicit or implicit commit is not allowed in stored function or trigger.
и значение все равно добавляется в базу не зависимо от того есть такой id там или нет.
те rollback не выполняется
подскажите почему???

Отредактированно Temi4 (03.12.2009 23:33:38)

Неактивен

 

#15 04.12.2009 00:27:11

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

Re: Помогите написать триггер

Потому, что такие ограничения в MySQL на триггеры (http://dev.mysql.com/doc/refman/5.0/en/ … tions.html):
For stored functions (but not stored procedures), the following additional statements or operations are disallowed:
*    Statements that perform explicit or implicit commit or rollback. 

Неактивен

 

#16 09.12.2009 23:37:45

Temi4
Участник
Зарегистрирован: 25.11.2009
Сообщений: 12

Re: Помогите написать триггер

CREATE PROCEDURE simpleproc (IN id_pg INT)
BEGIN
DECLARE val INT;
DECLARE val2 INT;
set val=SELECT SQL_NO_CACHE COUNT(*) FROM dle_titles where id_page=id_pg group by id_page;
set val2=Select max(id) from dle_titles where id_page=id_pg group by id_page;
IF(val>1) THEN
delete from dle_titles where id_page=id_pg and id=val2;
END IF;
END;%


Подскажите пожалуйста, что не так в синтаксисе этой процедуры?

Неактивен

 

#17 09.12.2009 23:54:19

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите написать триггер

1. FAQ#10.
2. Ошибки в SET. Правильно писать
   SELECT val := COUNT(*) ...

Неактивен

 

#18 10.12.2009 00:31:41

Temi4
Участник
Зарегистрирован: 25.11.2009
Сообщений: 12

Re: Помогите написать триггер

paulus, спасибо огромное за помощь попробую)
а насчет дле, я просто таблицу для тестов взял из дле готовую, а остальное пхп пишу сам + майадмин

CREATE PROCEDURE len( OUT l int, IN id int )
BEGIN
SELECT LENGTH( titles ) INTO l FROM dle_titles WHERE id_page = id;
END ; %

call len(@a,'94');
select @a;

Команды выполнялись одна за другой.

Почему @a возвращает null хотя просто
SELECT LENGTH( titles ) FROM dle_titles WHERE id_page = '94';
возвращает 12???


1415: Not allowed to return a result set from a trigger - при добавление  значения тригер срабатывает и выдвет такое значение с чем может быть связано???

блин сколько же сложностей в mysql просто ужас.))но раз решил надо научится

Отредактированно Temi4 (10.12.2009 00:51:57)

Неактивен

 

#19 10.12.2009 10:49:38

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите написать триггер

Какой у Вас клиент? Я вот сделал аналогичную процедурку, и у меня работает:

mysql> CREATE DEFINER=`root`@`localhost` PROCEDURE `len`(OUT l INT, IN u VARCHAR(20))
> BEGIN
>    SELECT LENGTH( password ) INTO l FROM user WHERE user = u;
> END;;
Query OK, 0 rows affected (0,07 sec)

mysql> call len(@a, 'root');;
Query OK, 0 rows affected (0,02 sec)

mysql> select @a;;
+------+
| @a   |
+------+
|   41 |
+------+
1 row in set (0,00 sec)


Скорее всего, Ваш клиент делает второй запрос в другом соединении.
--
Триггеры не могут возвращать ничего, т.к. они триггеры smile

Неактивен

 

#20 10.12.2009 10:58:37

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

Re: Помогите написать триггер

Temi4 написал:

paulus, спасибо огромное за помощь попробую)
а насчет дле, я просто таблицу для тестов взял из дле готовую, а остальное пхп пишу сам + майадмин

CREATE PROCEDURE len( OUT l int, IN id int )
BEGIN
SELECT LENGTH( titles ) INTO l FROM dle_titles WHERE id_page = id;
END ; %

call len(@a,'94');
select @a;

Команды выполнялись одна за другой.

Почему @a возвращает null хотя просто
SELECT LENGTH( titles ) FROM dle_titles WHERE id_page = '94';
возвращает 12???

Это зависит от клиента, которым вы пользуетесь. Некоторые клиенты, например Qeury Browser, после выполнения каждого запроса разрывают соединение. А так как пользовательская переменная живет в течении сессии, то при след соединении данная переменная не определена, т.е. NULL.

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

Temi4 написал:

1415: Not allowed to return a result set from a trigger - при добавление  значения тригер срабатывает и выдвет такое значение с чем может быть связано???

Это связано с ограничениями, ссылка приводилась выше. Видимо у вас в коде триггера есть SELECT ...  Результатом выполнения триггера не может быть выборка, использовать SELECT внутри триггера можно только, присваивая результат переменной.

Рекомендую прочитать ссылку про ограничения на хранимый код, там немного текста.

Неактивен

 

#21 14.12.2009 23:20:37

Temi4
Участник
Зарегистрирован: 25.11.2009
Сообщений: 12

Re: Помогите написать триггер

спасибо за разьяснения. По чуть чуть разбираюсь.
Подскажите а в mysql можно написать триггер отменяющий добавление, в случае если значение в каком то поле повторяется?

Неактивен

 

#22 14.12.2009 23:28:07

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

Re: Помогите написать триггер

Можно, например, в триггере before insert изменяя вносимые значения так, чтобы вызвать ошибку duplicate key error smile
Но это хак. Лучше использовать для этих целей хранимую процедуру, с помощью которой добавлять значения.

Неактивен

 

#23 15.12.2009 00:47:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите написать триггер

А еще лучше добавить уникальный ключ на нужные поля и не писать
триггер вообще wink

Неактивен

 

#24 15.12.2009 01:26:25

Temi4
Участник
Зарегистрирован: 25.11.2009
Сообщений: 12

Re: Помогите написать триггер

понятно  спасибо огромное. просто архитектура mssql и mysql различны. Принцип понял спасибо.
Рад что помогли, если чем то могу помочь вам Вы только скажите)

Неактивен

 

#25 24.12.2009 18:01:20

free_girl
Участник
Зарегистрирован: 24.12.2009
Сообщений: 2

Re: Помогите написать триггер

Помогите пожалуйста написать триггер! суть: при заключении договора (добавляется соответствующая строка в таблицу contract, где есть в том числе поля ID агента - agent_id и сумма сделки -  summ_$) надо вычислить зарплату агента (3% от суммы сделки) и записать в таблицу agent_salary (поля: agent_id, salary). я пишу так:
delimiter //
create trigger salary_counter after insert on contract
for each row begin
insert into agent_salary values(contract.agent_id, contract.summ_$*0.03);
end;
delimiter ;

но это неправильно. подскажите, плиз, что и как поправить?

Неактивен

 

Board footer

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