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/OPTIMI­ZE/ALTER smaže trigger z information_sche­ma. 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í. ;)