Portál AbcLinuxu, 14. května 2025 05:44

Dotaz: MySQL trigger nad tabulkou nad kterou se spousti

1.4.2010 13:39 sillySQL
MySQL trigger nad tabulkou nad kterou se spousti
Přečteno: 1205×
Odpovědět | Admin
Vytvořil jsem trigger, který nemůže vyvolat loop:
CREATE TRIGGER tr_usernameSync AFTER UPDATE ON mailbox_base
  FOR EACH ROW BEGIN
    IF (NEW.username != CONCAT(NEW.local_part, '@', NEW.domain)) THEN BEGIN
      UPDATE `mailbox_base` SET `username` = CONCAT(NEW.local_part, '@', NEW.domain);
    END;
    END IF;
  END;
Ale mysql mi při pokusu o update tabulky zahlásí "#1442 - Can't update table 'mailbox_base' in stored function/trigger because it is already used by statement which invoked this stored function/trigger."

Zkoušel jsem to obejít tak, že jsem v triggeru volal proceduru na ten update, ale stejně to nefungovalo. Zkouším to rozchodit už nějakou tu hodinku. Mohl by mi někdo poradit co s tím?
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

1.4.2010 13:51 Ondřej Kopka | skóre: 20 | blog: ondrejk
Rozbalit Rozbalit vše Re: MySQL trigger nad tabulkou nad kterou se spousti
Odpovědět | | Sbalit | Link | Blokovat | Admin
hmm, ted strelim od boku, ale co takhle zkusit neco jako:
CREATE TRIGGER tr_usernameSync AFTER UPDATE ON mailbox_base
  FOR EACH ROW BEGIN
    IF (NEW.username != CONCAT(NEW.local_part, '@', NEW.domain)) THEN BEGIN
      NEW.username = CONCAT(NEW.local_part, '@', NEW.domain);
    END;
    END IF;
  END;
1.4.2010 13:54 sillySQL
Rozbalit Rozbalit vše Re: MySQL trigger nad tabulkou nad kterou se spousti
Jo, zrovna sem to chci napsat, jen tam musí být BEFORE.
CREATE TRIGGER tr_usernameSync BEFORE UPDATE ON mailbox_base
  FOR EACH ROW BEGIN
    IF (NEW.username != CONCAT(NEW.local_part, '@', NEW.domain)) THEN BEGIN
      SET NEW.username = CONCAT(NEW.local_part, '@', NEW.domain);
    END;
    END IF;
  END;
Tohle funguje. Proč ale nefunguje tamto?
1.4.2010 13:56 Ondřej Kopka | skóre: 20 | blog: ondrejk
Rozbalit Rozbalit vše Re: MySQL trigger nad tabulkou nad kterou se spousti
rekl bych ze zavolanim update bys opet vyvolal ten trigger, coz by vedlo k zacykleni
1.4.2010 13:58 Ondřej Kopka | skóre: 20 | blog: ondrejk
Rozbalit Rozbalit vše Re: MySQL trigger nad tabulkou nad kterou se spousti
tahle definice by mozna byla lepsi:
CREATE TRIGGER tr_usernameSync BEFORE UPDATE ON mailbox_case FOR EACH ROW
1.4.2010 13:55 Ondřej Kopka | skóre: 20 | blog: ondrejk
Rozbalit Rozbalit vše Re: MySQL trigger nad tabulkou nad kterou se spousti
pripadne se podivej sem: http://forge.mysql.com/wiki/Triggers, konkretne sekce No when conditions
1.4.2010 17:08 sillySQL
Rozbalit Rozbalit vše Re: MySQL trigger nad tabulkou nad kterou se spousti
Uff, já si dával pozor aby nevznikl loop kvůli tomu update a už vůbec jsem si neuvědomil že ten samotný trigger vyvolává loop. :-)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.