Listopad 15th, 2006Závažná chyba při tvorbě triggerů
Původně jsem chtěl napsat článek o triggerech a jejich využití. Zjistil jsem ale nepříjemnou chybu, která bez jakýchkoli servítek smaže můj pracně vytvořený trigger, aniž by mi databáze cokoli zdělila.
Jedná se o bug 18153 a jeho duplikace 18816.
Tato nepříjemná chyba mi při provedení dotazu REPAIR/OPTIMIZE/ALTER smaže trigger z information_schema. Problém je o to horší, že použitý název je uložen v souboru *.TRN, který se pro změnu zachová! Takže nyní mám smazaný trigger a navíc nemůžu použít původní název triggeru. Jediné možné řešení je fyzicky smazat soubory *.TRN a vytvořit trigger znovu.
Opět uvedu malý příklad:
CREATE TABLE tabulka (
id int NOT NULL AUTO_INCREMENT,
nazev varchar(10) NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE tabulka_zaloha (
id int NOT NULL AUTO_INCREMENT,
nazev varchar(10) NOT NULL,
PRIMARY KEY(id)
);
A nyní si vytvořím trigger.
/* tento prikaz muze vyhodit chybu, pokud trigger existuje, zde totiz existuje dalsi bug s IF EXISTS */
DROP TRIGGER nefungujes$$
CREATE TRIGGER nefungujes
AFTER INSERT ON tabulka
FOR EACH ROW
BEGIN
INSERT INTO tabulka_zaloha (id, nazev) VALUES (new.id, new.nazev);
END$$
DELIMITER ;
Vše se zdá být v pořádku:
Nyní přidám jeden sloupeček do tabulky tabulka.
A trigger je pryč:
Vytvořím si ho znovu:
DROP TRIGGER nefungujes$$
CREATE TRIGGER nefungujes
AFTER INSERT ON tabulka
FOR EACH ROW
BEGIN
INSERT INTO tabulka_zaloha (id, nazev) VALUES (new.id, new.nazev);
END$$
DELIMITER ;
Nevytvořím!
TRIGGER already EXISTS
Jediné možné řešení je nyní smazat soubor *.TRN nebo vytvořit trigger pod jiným názvem.
Tímto apeluji na všechny, kteří triggery používají: zálohujte si je!
Přístě už se budu věnovat těm triggerům a jejich využití. ;)