Ошибка 1422, триггер

iceman

говнокодер
Ошибка 1422, триггер

PHP:
DELIMITER |

  CREATE
  TRIGGER trigger_catalog_content_fk_upd BEFORE UPDATE
  ON modules_content_catalog_fk FOR EACH ROW
  BEGIN
    IF New.fk_catalog_parent = New.fk_catalog THEN
      SET New.fk_catalog_parent = 0;
    ELSEIF New.fk_catalog_parent IN (SELECT fk_catalog FROM modules_content_catalog_fk WHERE fk_catalog_parent = New.fk_catalog) THEN
      ROLLBACK;
    END IF;
  END;

| DELIMITER;
появляется ошибка:
Script line: 32 Explicit or implicit commit is not allowed in stored function or trigger.

обратите свой взгляд на

PHP:
    ELSEIF New.fk_catalog_parent IN (SELECT fk_catalog FROM modules_content_catalog_fk WHERE fk_catalog_parent = New.fk_catalog) THEN
      ROLLBACK;
    END IF;
если новый родительский каталог вход в список каталогов, у которых родительский каталог заменяемый каталог то откатить такое действие...

т.е. чтобы не было связи
3=>4
4=>3

и каталог не утанул +)
 

iceman

говнокодер
нет,


есть такая запись
fk_c | fk_c_parent
3 | 0
4 | 3
5 | 3

и если вдруг для fk_c = 3 назначается fk_c_parent = 5
то тригер не принимал эту запись...

т.к. fk_c = 5 имеет родительский каталог fk_c_parent = 3

PHP:
SELECT fk_catalog FROM modules_content_catalog_fk WHERE fk_catalog_parent = New.fk_catalog
возвратит все записи
4
5

т.е. если fk_c_parent будет входить в эту группу, то откатить манипуляцию над записью

-~{}~ 15.08.08 10:56:

------------------------

я изминил логику триггер, теперь работает...
PHP:
DELIMITER |

  CREATE
  TRIGGER trigger_catalog_content_fk_upd BEFORE UPDATE
  ON modules_content_catalog_fk FOR EACH ROW
  BEGIN
    SET @x = (SELECT fk_catalog_parent FROM modules_content_catalog_fk WHERE fk_catalog = New.fk_catalog_parent);

    IF New.fk_catalog_parent = New.fk_catalog THEN
      SET New.fk_catalog_parent = 0;
    END IF;

    IF New.fk_catalog = @x THEN
      SET New.fk_catalog_parent = old.fk_catalog_parent;
    END IF;
  END;

| DELIMITER;
Dl я тебя теперь понял!
 

Dl

Новичок
Ок)

-~{}~ 15.08.08 11:15:

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

iceman

говнокодер
диспечеру я на пальцах объясню что можно делать а что нельзя и что будет без результатно... просто времени очень не хватает на продумку всего
 
Сверху