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