LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> MySQL (47) - Triggery a praxe

S prstem na spoušti spouštíme spouště, aneb MySQL, triggery a praxe.

25.11.2005 06:00 | Petr Zajíc | Články autora | přečteno 39109×

Komerční sdělení: Pořádáme Kurzy MySQL

V minulém dílu jsme si řekli dost o teorii triggerů, takže je čas podívat se na to, jak je můžeme v MySQL použít v praxi. Na jednu stranu to bude trochu smutné čtení, protože MySQL triggery zdaleka neumějí to, co triggery třebas ve Firebirdu. Na druhou stranu je ale i tak život se spouštěmi veselejší než bez nich.

Triggery v praxi

Uvedli jsme, že triggery mohou přispívat k bezpečnosti dat a že jedním z příkladů může být "bezpečné" mazání řádků v tabulce. Bezpečné proto, že záznam není vymazán úplně, ale data jsou přesunuta do jiné tabulky, takže je později lze dohledat. Pokud tedy budeme mít následující tabulku:

create table bezpecna (id int not null auto_increment, jmeno varchar( 50 ) not null, plat decimal(12,4) not null, primary key (id)) type = myisam;

S testovacími daty:

insert into bezpecna (jmeno, plat) values ('Jarda', 12000);
insert into bezpecna (jmeno, plat) values ('Pepa', 13000);
insert into bezpecna (jmeno, plat) values ('Franta', 14000);
insert into bezpecna (jmeno, plat) values ('Honza', 10000);
insert into bezpecna (jmeno, plat) values ('Anička', 11500);

můžeme chtít místo mazání z této tabulky data přesunout do "záložní" tabulky s tím, že si zároveň poznamenáme, kdo a kdy ta původní data promazával. Něco takového zcela určitě můžeme svěřit triggeru. Vytvoříme si tabulku, která bude obsahovat data z původní tabulky a ještě údaj o "mazajícím" uživateli a čase, kdy se řádky odstraňovaly:

create table bezpecna_zaloha like bezpecna;
alter table bezpecna_zaloha add column cas_odstraneni datetime;
alter table bezpecna_zaloha add column uzivatel varchar (128);

a konečně, vytvoříme trigger, který při odstraňování dat ta původní data uchová v tabulkce bezpecna_zaloha:

create trigger trSaveRows
before delete
on bezpecna
for each row
begin
  insert into bezpecna_zaloha(id, jmeno, plat, cas_odstraneni, uzivatel)
  values (old.id, old.jmeno, old.plat, now(), user());
end;

Jaký je význam toho všeho? Výsledek spočívá v tom, že když se nyní pokusíte odstranit nějaká ta data z tabulky bezpecna, tak... vyzkoušejte postupně tyto příkazy:

delete from bezpecna where id > 2;
select * from bezpecna;
select * from bezpecna_zaloha;

Jak vidíte, smazaná data se objeví v tabulkce bezpecna_zaloha. K tomu všemu bude jistě vhodné uvést pár poznámek:

  1. Trigger se tvoří pomocí příkazu CREATE TRIGGER.
  2. Jméno triggeru musí být pro danou databázi jedinečné. To znamená, že nelze mít dva shodně pojmenované triggery ani na dvou různých tabulkách. Zvykl jsem si názvy triggerů začínat písmeny tr, abych je na první pohled odlišil od jiných objektů v databázi (jako jsou uložené procedury).
  3. U každého triggeru musí být uvedeno, před nebo po jaké akci je spuštěn. Možnosti jsou BEFORE INSERT, BEFORE UPDATE, BEFORE DELETE, AFTER INSERT, AFTER UPDATE, AFTER DELETE. V MySQL navíc platí omezení, že pro každou z vyjmenovaných akcí smí existovat nejvýše jeden trigger. To mě trochu mrzí, protože v praxi někdy bývá zapotřebí provést více souvisejících akcí a nejpřehlednější by bylo umístit tyto akce do samostatných triggerů. Aby těch omezení nebylo málo, neumožňuje MySQL definovat jeden trigger pro dvě akce najednou, což je v jiných databázích obvyklé.
  4. Každý trigger musí souviset právě s jednou tabulkou. V našem případě souvisí s tabulkou bezpecna. Mimochodem - jestliže je tabulka odstraněna, jsou odstraněny i všechny související triggery.
  5. Tělo spouště v MySQL začíná klauzulí FOR EACH ROW a ta značí, že následující akce bude provedena tolikrát, kolik je řádků ovlivněných akčním dotazem. Většinou předem nevíte, kolik řádků bude ovlivněno, takže byste neměli spoléhat na to, zda a kolikrát bude tělo triggeru provedeno.
  6. Jak jsem uvedl již v minulém díle seriálu, triggery mají přístup k měněným datům. Ten je reprezentován virtuálními tabulkami old a new. Jejich význam je ten, že tabulka old obsahuje původní data (ta, která se mají mazat pomocí DELETE nebo ta, která se upravují pomocí UPDATE) a tabulka new obsahuje konečná data (ta, která se vkládají pomocí INSERT nebo ta, která budou v tabulce po provedení UPDATE). My jsme v příkladu právě toho využili a data "schovali" do jiné tabulky.
  7. Konečně, v triggeru lze využít i vestavěných funkcí. My jsme použili jednu funkci vracející současný čas a další vracející právě aktivního uživatele. Díky tomu máme kompletní přehled o tom, kdo a kdy data měnil.

K příkladu ještě jedno varování: Trigger se NESPUSTÍ při použití příkazu TRUNCATE TABLE. To není chyba, ale vlastnost DMBS, takže pokud se spoléháte na nějakou akci, která se spustí při odstraňování dat z tabulky, buďte opatrní. Při použití DELETE FROM TABLE se však trigger spustí a zpracuje všechny řádky, které ještě v nebohé tabulce zbývají.

Triggery jako kontrola dat

Další typickou činností triggerů je kontrola měněných dat. Mělo by tedy jít například napsat trigger, který do naší tabulky zakáže vkládat platy vyšší než 30000,- Kč. Vypadal by nějak takhle:

create trigger trMaxPlat
before insert
on bezpecna
for each row
begin
  if new.plat>30000 then /*něco, co akci zruší*/;
  end if;
end;

Bohužel, v době psaní tohoto článku je prakticky nemožné vyhodit nějakou smysluplnou chybu z triggeru, a to jejich použití pro kontrolu dat téměř znemožňuje. Pro informaci se můžete podívat do diskuse k tomuto tématu. Manuál doporučuje pro takový případ "uměle" vytvořit například chybu porušení primárního klíče, podle mě je to však jen chabá náplast. Problém je reportován do buglistu (sem a sem), tak uvidíme, co s tím bude vývojářský tým dělat.

Verze pro tisk

pridej.cz

 

DISKUZE

Delimiter 24.3.2014 07:40 Robin "BoB" Hajtingr
  L Re: Delimiter 24.3.2014 13:32 František 'patizoNix' Kytka
    L Re: Delimiter 24.3.2014 13:35 Michal Linha
      L Re: Delimiter 24.3.2014 13:38 Robin "BoB" Hajtingr
        L Re: Delimiter 24.3.2014 13:39 Michal Linha
          L Re: Delimiter 24.3.2014 13:40 Robin "BoB" Hajtingr
            L Re: Delimiter 24.3.2014 13:42 Michal Linha
              L Re: Delimiter 24.3.2014 13:44 Robin "BoB" Hajtingr
                L Re: Delimiter 24.3.2014 13:46 Michal Linha
                  L Re: Delimiter 24.3.2014 13:54 Michal Linha




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

27.2.2017 22:12 /František Kučera
Pozvánka na 137. sraz OpenAlt – Praha: Tentokrát jsme si pro vás připravili neobvyklou akci. Ve středu 1.3. v 17:30 nás přivítá sdružení CZ.NIC ve svých prostorách v Milešovské ulici číslo 5 na Praze 3, kde si pro nás připravili krátkou prezentaci jejich činnosti. Následně navštívíme jejich datacentrum pod Žižkovskou věží. Provedou nás prostory, které jsou běžnému smrtelníkovi nedostupné!
Po ukončení prohlídky se všchni odebereme do hostince U vodoucha, Jagelonská 21, Praha 3 pochutnat si na některém z vybraných piv či dát si něco na zub. Rezervaci máme od 19:30, heslo je OpenAlt.
Ale pozor! Do prostor datového centra máme omezený přístup, dostane se tam pouze 10 lidí! Takže kdo přijde dříve, ten má přednost, a občanky s sebou! Kdo nebude chtít na prohlídku datového centra, může se pomalu přesunout do hostince U vodoucha a u nepřeberné nabídky piv počkat na ostatní.
Přidat komentář

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

8.1.2017 17:51 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 19. ledna od 18:30 v pražském hackerspacu Brmlab. Tentokrát je tématem srazu ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. K vidění bude mechanická klávesnice dasKeyboard, trackball Logitech nebo grafický tablet (a velký touchpad) Wacom. Přineste i vy ukázat svoje zajímavé klávesnice a další HW. V 18:20 je sraz před budovou, v 18:30 jdeme společně dovnitř, je tedy dobré přijít včas. Podle zájmu se později přesuneme do nějaké restaurace v okolí.
Přidat komentář

1.12.2016 22:13 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.
Komentářů: 1

4.9.2016 20:13 /Pavel `Goldenfish' Kysilka
PR: Dne 22.9.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, provozování ERP v cloudu, o hostování různých typů softwaru, ale třeba i o zálohování dat nabízeném podnikům formou služby.
Přidat komentář

1.9.2016 11:27 /Honza Javorek
Česká konference o Pythonu, PyCon CZ, stále hledá přednášející skrz dobrovolné přihlášky. Máte-li zajímavé téma, neváhejte a zkuste jej přihlásit, uzávěrka je již 12. září. Konference letos přijímá i přednášky v češtině a nabízí pomoc s přípravou začínajícím speakerům. Řečníci mají navíc vstup zadarmo! Více na webu.
Přidat komentář

27.8.2016 8:55 /Delujek
Dnes po 4 letech komunitního vývoje vyšla diaspora 0.6.0.0
diaspora* je open-source, distribuovaná sociální síť s důrazem na soukromý
Více v oficiálním blog-postu
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

24.3.2017 11:54 / Hui
country cottages

16.3.2017 16:33 / BezvaDesign.cz
Re: Hledám grafika do teamu

9.3.2017 11:44 / Jaromir Obr
Re: chyba

18.1.2017 20:18 / martin horky
Spolupraca linuxu a microsoftu

17.1.2017 9:57 / Pavel Hrubeš
Re: Externí USB televizní karta

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze