Dnes: 29. dubna 2017    | Registrace | Hledáme | Redakce | Info | Testy | Školení | Ocenění | Nápověda | Čtenář: nepřihlášen

Rychlé odkazy
  • Hlavní stránka
  • Seznam rubrik
  • Ankety
  • Editoriály
  • TOP 15
  • KONFERENCE 2008
  • KONFERENCE 2007
  • KONFERENCE 2006
  • KONFERENCE 2005
  • KONFERENCE 2004
  • Sborník
  • Testy
  • Virtuální školení
  • Personalizace


  • Hledáte práci?
    Hledáme redaktora - pojďte s námi tvořit Databázový svět!

    Vyhledávání

    Hledej
    na Databázovém světě!



    Rozšířené vyhledávání

    Rubriky
    Aktuality
    Bezpečnost
    Business
    Česká scéna
    Datové sklady
    Dokumentace
    Dotazovací jazyky
    Hardware
    Historie
    Komentáře
    Literatura
    Metodologie
    Nondb
    Open Source
    Poradna
    Produkty
    Případové studie
    Redakce
    Rozhovory
    Standardy
    Technologie
    Tipy - triky
    Tiskové zprávy
    Vývoj
    Vývojové nástroje
    Zajímavosti

    Co je to?
    Databázový stroj
    (Database Engine)

    Pod pojmem Database Engine (tedy pod databázovým strojem) se obvykle rozumí jádro databázového serveru a základní obslužné programy tohoto jádra (například zajišťující vzdálené připojení uživatelů). Lze tedy říci, že databázový stroj je podmnožinou databázového serveru, přičemž pod pojmem databázový server je nutné vidět vybavení (typicky softwarové) pracující nad danou databází a zajišťující veškeré činnosti (včetně všech potřebných komunikací), které nad danou databází mají být zajišťovány.

    Akce
    Dynamická Datová Centra
    - na semináři se seznámíte s komplexním řešením a koncepcí Dynamických Datových Center od Fujitsu Siemens Computers se speciálním důrazem na řešení FlexFrame.

    Textová inzerce
    IBPhoenix - Vše o InterBase a Firebirdu.

    Smějete se rádi? - Pak je pro vás Vtipník to pravé!

    Prodejce reklamy - Hledáme schopného prodejce reklamního prostoru, možnost i externí spolupráce.

    Přihlášený čtenář
    Nepřihlášený čtenář

    O portálu
    Databázový svět
    ISSN: 1213-5933

    Web je optimalizován pro rozlišení 1024x768, nicméně kromě větších rozlišení podporujeme i 800x600. Podrobnosti najdete zde.

    Chcete-li mít kdykoliv možnost zkontrolovat obsah našeho portálu, můžete využít podporu rss. Podrobnosti najdete zde.
    Vystřelte si z databáze


    [Vývoj] - Spoušť neboli trigger je programový kód napsaný ve stejném jazyce, v jakém například píšete uložené procedury. Můžete tedy používat stejné programové konstrukty a ještě máte k dispozici několik speciálních proměnných – tzv. kontextové proměnné. Pojďme se podívat na to, co spouště jsou, k čemu je lze použít a nakonec si ukážeme i praktický příklad pro databázovou platformu Firebird.



    Trigger je velice podobný uložené proceduře, avšak s tím rozdílem, že je přidružen ke konkrétní tabulce (případně k datovému pohledu). Dalším rozdílem je nemožnost spustit trigger "ručně", vždy je spuštěn odpovídající akcí na dané tabulce – insert, update, delete. Některé platformy umožňují přiřadit jeden trigger i více akcím najednou.

    Každého asi napadlo, na co je to celé dobré? Díky spouštím můžete např. vkládat data do dalších sloupců při změně původních dat.

    Představte si například učebnicový příklad, kdy máte tabulku zamestnanci, která udržuje informace o zaměstnancích. A budete chtít mít v jednom ze sloupců celé jméno. Stačí tedy udělat spoušť, která při vložení (nebo úpravě) záznamu vezme jméno a příjmení a vloží je do tohoto sloupce – ponechme stranou smysluplnost tohoto jednání.

    Dalším dobrým příkladem může být dodržování konzistence dat v databázi . V seriálu o Firebirdu a anketách bylo možné vidět využití spouště ke generování jednoznačného identifikátoru – primárního klíče. Stejně tak – pokud nemáte databázi normalizovanou nebo je v nižší NF – je trigger dobrou volbou, jak data udržet v konzistentním stavu.

    Trigger je vytvořen pomocí příkazu CREATE TRIGGER (přesný popis najdete v dokumentaci k vaší oblíbené platformě).

    Každá spoušť může být (obvykle) definována jako before (před) resp. after (potom). "Before spouště" jsou prováděny ještě před opravdovým provedením dané akce, naproti tomu "after spoušť" je "vystřelena" až po provedení akce, která vyvolala daný trigger.

    Vzhledem k tomu, že může být někdy vhodné trigger pouze vytvořit – leč neaktivovat (např. pokud bude následovat naplnění daty ze zálohy, případně ověřenými atd.), můžete při vytváření nebo při změně specifikovat jeho deaktivaci slovem INACTIVE a následně aktivovat pomocí ACTIVE.

    V triggeru jsou k dispozici tzv. kontextové proměnné. Konkrétně (závisí na typu databázové platformy) new, resp. old. První proměnná je k dispozici při vkládání a změně (update), proměnná old je k dispozici při mazání a změně (update).

    Mějte například následující tabulku:

    create table jmena(jmeno varchar(20),
                       prijmeni varchar(20))
    

    Při smazání máte k dispozici obsah mazaného řádku v old.jmeno resp. old.prijmeni . U proměnné new můžete tento obsah (smysl to má pouze u "before triggeru") modifikovat a vložit tím vlastně do databáze úplně jinou hodnotu.

    Jak již bylo řečeno, některé databázové platformy umožňují přiřadit jeden trigger více akcím. Potom jsou k dispozici ještě proměnné INSERTING, UPDATING, DELETING – jejich názvy jsou dosti výmluvné. Tímto můžete prováděný kód větvit, pokud se chová odlišně pro různá spuštění.

    Triggery se tedy nejčastěji využívají na korekci nějaké hodnoty při vkládání dat do databáze – primární klíč, nejbližší id, hodina atd. My si ukážeme trochu složitější příklad, kde budete modifikovat i část dat v databázi (za účelem dosažení vyšší konzistence dat).

    Uvažme tento případ: Mějme tabulku sekcí, článků a vazební tabulku, která určuje, kam který článek patří (článek může patřit do více sekcí). Příkladem může být např. web s tipy a triky. Zároveň chceme ony články nějak třídit. Prvním nápadem pro zajištění třídění bude použití datumu. To sice není špatný nápad, ale použijeme ještě lepší řešení za pomocí triggerů.

    Přidáme do vazební tabulky další sloupec, který nazveme například ordering. Tento sloupec bude uchovávat pořadí, na jakém se má daný článek (v dané sekci) zobrazit – umožní mít například skvělý tip navrchu.

    create trigger clanky_kategorie_serad_BID0
    active before insert or delete position 0
    as
    declare variable max_ordering integer;
    begin
      if (inserting) then
      begin
          --nejprve pohlidame ordinalitu
        select max(ordering) 
          from clanky_kategorie 
          where kategorie_id = new.kategorie_id into :max_ordering;
        if (new.kategorie_id > (:max_ordering+1)) then
          new.ordering = :max_ordering +1;
          --pak posuneme nahoru; muzeme zaradit i do else
        update clanky_kategorie 
          set ordering = ordering +1 
          where ordering >= new.ordering 
            AND kategorie_id = new.kategorie_id;
      end
      if (deleting) then
      begin
         --posuneme dolu 
        update clanky_kategorie 
          set ordering = ordering -1 
          where ordering >= old.ordering 
            AND kategorie_id = old.kategorie_id;
      end
    end
    

    (BID0 značí Before Insert Update position 0 – vhodné pro rychlou orientaci; syntaxe je pro platformu Firebird.)

    Pokusím se tuto ilustrující spoušť trochu přiblížit. Na prvních dvou řádcích je klasická definice triggeru. Za klíčovým slovem as je definována jedna pomocná proměnná, která je využita dále.

    Následuje tělo. Celé provádění se rozpadá na dvě větve. První – inserting – nejprve zjistí, jestli nechcete článek vložit "příliš daleko". Pokud ano, je lepší jej dát na konec. Tento krok sice není nezbytně nutný, ale udrží číselnou řadu pěkně spojitou – ve smyslu celých čísel. Potom již jen korigujete ostatní pozice, snaží-li se článek na některou "protlačit". Samozřejmě přitom zachováváte pořadí v jiných kategoriích.

    Pokud je z vazební tabulky záznam vymazáván – deleting, jsou "sesypány" níž pouze články v dané kategorii.

    Všímavý čtenář si jistě všiml, že trigger neošetřuje stav při změně (updatu) obsahu. Obecně to samozřejmě není problém, máte-li již hotové vložení a smazání, problémem však zůstává update tabulky při této akci prováděný. Pokud by byl trigger definován i pro update, mohlo by docházet k nekontrolovanému zanořování až do limitu pro daný databázový stroj. Řešení tohoto případu už není vázáno pouze na problematiku triggerů a přesahuje rámec tohoto článku.

    Budeme opět rádi, pokud vyjádříte svůj názor v diskuzi pod článek, případně vznesete otázku nebo námět do specializovaného fóra.

    ( Celý článek! | Autor: Jiří Činčura | Počet komentářů: 0 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

    Anketa
    Kolik ročně utratíte za dovolené?

    Nic 
     (1128 hl.)
    Do 1 000,- Kč 
     (821 hl.)
    Do 10 000,- Kč 
     (786 hl.)
    Do 25 000,- Kč 
     (1048 hl.)
    Do 50 000,- Kč 
     (809 hl.)
    Do 75 000,- Kč 
     (943 hl.)
    Více než 75 000,- Kč 
     (788 hl.)

    Celkem hlasovalo: 6323


    Poslední komentáře
    frontierd@126.com
    frontierd@126.com
    frontierd@126.com
    c
    http://www.coachoutl

    Newsletter
    Přihlaste si nezávazně - i bez registrace - odběr informačního newsletteru. Podrobné informace najdete zde.

    Emailová adresa:


    Kalendář
    <<  Duben  >>
    PoÚtStČtSoNe
         12
    3456789
    10111213141516
    17181920212223
    24252627282930

    Redakci připojuje


    Nejčtenější

    Databáze je prázdná!


    Nejvíce komentářů

    Databáze je prázdná!


    Reklama






    Nenechte si ujít články na dalších webech




    Na této stránce použité názvy programových produktů, firem apod. mohou být ochrannými známkami
    nebo registrovanými ochrannými známkami příslušných vlastníků.

    Databázový svět | dfKlub - digitální fotografie | Vtipník - vtipy přímo k Vám | Reminder - přestaňte zapomínat | Databázový svět

    Copyright (c) 2004 AVRE Publishing, spol. s r.o. Všechna práva vyhrazena