středa 15. listopadu 2006

Zá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 DATABASE stupidni_test;
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.

DELIMITER $$
/* 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:

SHOW TRIGGERS;


Nyní přidám jeden sloupeček do tabulky tabulka.

ALTER TABLE stupidni_test ADD COLUMN cislo int default '0' AFTER nazev;


A trigger je pryč:

SHOW TRIGGERS;


Vytvořím si ho znovu:

DELIMITER $$
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 does not exist
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í. ;)

Žádné komentáře:

Okomentovat

Když programátor založí a řídí firmu

Jako malý jsem chtěl být popelářem. Ani ne tak proto, že bych měl nějaký zvláštní vztah k odpadkům, ale hrozně se mi líbilo, jak...