Dnes: 19. září 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?
    Konkurenční přístup
    Situace, kdy k jednomu zdroji dat (nejčastěji stejným záznamům v tabulce) přistupuje současně více uživatelů. Jedním z úkolů vyspělého SŘBD je zajistit, aby nedošlo k porušení konzistence dat (například aby uživatel z tabulky četl vždy aktuální data).

    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.
    Tipy a triky pro Oracle VI. – trochu jiné triggery


    [Tipy - triky] - V šestém pokračování seriálu věnovaného praktickým tipům a trikům pro databázovou platformu Oracle Database se zaměříme na problematiku triggerů spojených se systémovými událostmi a DDL příkazy. Cílem seriálu je přinášet vám nejen praktické informace, které vám mohou pomoci při správě či vývoji na této platformě, ale také upozorňovat na zajímavé funkce. O kterých možná ani nevíte, že existují.



    Věděli jste, že v databázové platformě Oracle Database můžete vytvořit trigger nejen na běžné DML operace, ale i na definiční příkazy a události databázového serveru? Jako příklad si ukážeme využití těchto systémových triggerů pro omezení účinnosti systémových práv určitého uživatele, automatické nastavování práv na nově vytvářené tabulky a automatické trasování určitých spojení.

    Mluvíme-li o databázových triggerech, máme většinou na mysli triggery svázané s DML operacemi nad tabulkami. V předchozím díle našeho seriálu jsme si ukázali, že tzv. Instead-of-triggery lze definovat i na pohledy. Věděli jste ale, že stejně tak můžete v Oracle Database navázat libovolnou logiku i na DDL operace, jako je například vytvoření tabulky či uživatele?

    Triggery lze dokonce definovat i na systémové události, jako je třeba start a ukončení běhu serveru, nebo přihlášení či odhlášení uživatele. Ukážeme si tři příklady, kde systémové triggery mohou ušetřit práci či zvýšit úroveň zabezpečení vaší databáze:

    Omezení rozsahu systémových práv
    Nedávno jsem si při přípravě jedné přednášky uvědomil, že budu potřebovat studentům umožnit vytvářet uživatele a měnit parametry dalších uživatelů, které sami vytvoří. Protože ale všichni pracovali se stejnou databází, bylo třeba zajistit, aby student nemohl měnit parametry uživatelů vytvořených jinými kolegy.

    V praxi se s podobným problémem můžete setkat v případě, kdy v jedné databázi spravujete více oddělení a potřebujete zajistit, že správu uživatelů v jednotlivých odděleních provádí vždy pouze správce dané sekce. Základní princip je shodný, jen vnitřní logika triggeru by byla jiná.

    K řešení problému nám pomůže specifická vlastnost BEFORE triggerů – pokud totiž trigger spuštěný před vlastní operací skončí chybou, vlastní operace se neprovede.

    V našem případě mají studenti uživatelská jména začínající na 'X' a potřebujeme zajistit, že budou moci vytvářet, měnit a rušit pouze uživatele, jejichž uživatelské jméno je ve formě (<uživatelské jméno studenta>_*) . Řešením je tento jednoduchý trigger:

    CREATE OR REPLACE TRIGGER user_admin 
      BEFORE CREATE OR ALTER OR DROP ON DATABASE 
      WHEN (ora_dict_obj_type='USER' and ora_login_user like 'X%')
    BEGIN
      IF NOT (ora_dict_obj_name like 
                ora_login_user ||'\_%' escape '\')
        THEN
          RAISE_APPLICATION_ERROR(-20000,
                                  'Sorry user ' ||
                                  ora_login_user ||
                                  ' cannot ' || 
                                  lower(ora_sysevent) || 
                                  ' user ' || 
                                  ora_dict_obj_name);
      END IF;
    END;
    /
    

    Trigger na úrovni databáze může vytvořit pouze uživatel se systémovým právem ADMINISTER DATABASE TRIGGER. Pro testovací účely lze použít uživatele SYS a jeho schéma. V produkčním prostředí by však bylo dobré uložit trigger do jiného schématu, schéma SYS je dobré ponechat pro systémové objekty.

    Použité funkce ora_* (ora_dict_obj_type, ora_dict_obj_name, ora_sysevent a ora_login_user) slouží k získání informací o operaci, která spuštění triggeru vyvolala. Úplný seznam těchto funkcí, včetně jejich popisu naleznete v manuálu Oracle Database Application Developer’s Guide – Fundamentals.

    Nyní vše otestujeme. Jako uživatel SYS, či jiný administrátor, vytvoříme uživatele XKRCH (studentský účet). Funkčnost jeho triggeru ověříme tím, že se jako uživatel XKRCH pokusíme vytvořit další uživatele:

    CREATE USER xkrch IDENTIFIED BY xkrch;
    User created.
    
    GRANT create user, alter user, drop user, connect TO xkrch;
    Grant succeeded.
    
    CONNECT xkrch/xkrch
    Connected.
    
    CREATE USER spatny IDENTIFIED by xxx;
    CREATE USER spatny IDENTIFIED by xxx
                                           *
    ERROR at line 1:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-20000: Sorry user XKRCH cannot create user SPATNY
    ORA-06512: at line 3
    
    CREATE USER xkrch_test IDENTIFIED by xxx;
    User created.
    

    Automatické nastavení práv pro nové objekty
    Představte si situaci, kdy potřebujete zajistit uživateli TEST právo číst data ze všech tabulek ve schématu HR. Nejde vám přitom jen o stávající tabulky, chcete také zajistit, zda když v budoucnosti ve schématu HR vznikne nová tabulka, uživatel TEST k ní bude mít přístup.

    Objektové právo SELECT můžete ale přidělit jen pro stávající tabulky. Tím pádem musíte při vytváření nových tabulek pamatovat i na definování práv.

    Druhým extrémem je systémové právo SELECT ANY TABLE. Docílíte toho, že uživatel bude moci číst data z libovolné stávající či budoucí tabulky v libovolném schématu. Takto silné právo, ale stejně jako ostatní práva "ANY", nepatří do rukou běžnému uživateli. Porušování principu přidělování nejnižších možných práv je základním chybou při správě databáze, která vám může v budoucnosti způsobit řadu problémů.

    Řešením je systémový trigger nad DDL příkazem, který práva pro novou tabulku přidělí automaticky po jejím vytvoření:

    CREATE OR REPLACE TRIGGER AUTOGRANT 
      AFTER CREATE ON hr.SCHEMA
      WHEN (ora_dict_obj_owner='HR' AND ora_dict_obj_type='TABLE')
    
      DECLARE
        l_str varchar2(255);
        l_job number;
    
    BEGIN
      l_str := 'GRANT SELECT ON "' || 
               ora_dict_obj_owner ||
               '"."' ||
               ora_dict_obj_name ||
               '" TO test';
    
      l_str:= 'execute immediate ''' ||
              l_str ||
              ''';';
    
      dbms_job.submit( l_job, l_str);
    
    END;
    /
    

    Důležité je uvědomit si, že výše uvedený trigger je prováděn s právy uživatele, který vytvořil trigger (nikoliv tabulku). Nejjednodušší je vytvořit jej přímo pod schématem HR. Je však třeba dát pozor – trigger na schématu HR se spouští při akcích provedených uživatelem HR, nikoliv při akcích na objektech ve schématu HR.

    Nastavení trasování pro vybraná spojení
    Při ladění rozsáhlejších aplikací může být problémem identifikovat operaci, která způsobuje výkonové problémy. Může vám v tom pomoci trasování aktivit do textového souboru. V něm naleznete všechny provedené dotazy, včetně jejich skutečného exekučního plánu, časů strávených jejich rozborem, prováděním a načítáním dat. Parametru SQL_TRACE=TRUE můžete nastavit pro celou databázi, ale to na produkčním systému způsobí generování velkého množství trasovacích informací. Druhou možností je aktivace pomocí příkazu ALTER SESSION, kterým se trasování zapne jen pro dané spojení. Ne vždy je ale možný zásah do kódu aplikace.

    Pokud ale víte, že chcete trasovat jen operace prováděné určitým uživatelem (nebo jste schopni jinak určit jaká spojení vás zajímají – například pomocí IP adresy klienta), můžete použít následující trigger:

    CREATE OR REPLACE TRIGGER LOGON_DEBUG 
      AFTER LOGON ON "HR".SCHEMA 
    
    BEGIN
      EXECUTE IMMEDIATE 'alter session set sql_trace=true';
    END;
    

    Trasovací soubor se vygeneruje do adresáře definovaného parametrem USER_DUMP_DEST. (obvykle $ORACLE_BASE/admin//udump). Cenné výsledky získáte, pokud tento soubor zpracujete programem "tkprof".

    Obdobným triggerem by bylo možné zajistit i například nastavení bezpečnostního kontextu pro potřeby Virtual Private Database nebo načtení dat do polí tvořících jakousi aplikační cache. Podobných příkladů vás ale určitě napadne mnohem více.

    Více se o triggerech v databázové platformě Oracle dovíte v manuálu Oracle Database Application Developer’s Guide – Fundamentals.

    Dnešní ukázky můžete vyzkoušet na libovolné edici Oracle Database, včetně volně dostupné Express Edition. V případě potřeby si Oracle Database můžete stáhnout na webu společnosti Oracle.

    O autorovi
    David Krch (*1976) pracuje ve společnosti Oracle Czech na pozici Technology Sales Consultant. Vystudoval obor Informační technologie na Vysoké škole ekonomické. Od roku 2001 působí ve firmě Oracle Czech na pozici Technology Sales Consultant, ve které je zodpovědný za podporu prodeje technologií Oracle. Z počátku se zaměřoval na portálová řešení. Od roku 2002 se specializuje na podporu prodeje databáze Oracle a témata související se zajištěním provozu, jako je bezpečnost a vysoká dostupnost. Jako nezávislý vývojář vyvíjel na zakázku databázové aplikace s využitím desktopových databází.

    Související články:
    Tipy a triky pro Oracle XVI. – rychlejší aplikace i bez změn dotazů podruhé (03.02.2009)
    Tipy a triky pro Oracle XV. – rychlejší aplikace i bez změn dotazů poprvé (21.11.2008)
    Tipy a triky pro Oracle XIV. – datová komprese (21.10.2008)
    Tipy a triky pro Oracle XIII. – externí data rychle (17.09.2008)
    Tipy a triky pro Oracle XII. – Jak na řízení přístupu na úrovni záznamů? (15.04.2008)
    Tipy a triky pro Oracle XI. – Error Logging Tables (12.11.2007)
    Tipy a triky pro Oracle X. – bojujete s češtinou v Oracle podruhé? (14.05.2007)
    Tipy a triky pro Oracle IX. – bojujete s češtinou v Oracle? (06.02.2007)
    Tipy a triky pro Oracle VIII. – jak na přenosy velkých dat podruhé (03.01.2007)
    Tipy a triky pro Oracle VII. – jak na přenosy velkých dat poprvé (21.11.2006)
    Tipy a triky pro Oracle V. – změna dat v pohledu? (06.09.2006)
    Tipy a triky pro Oracle IV. – analytické funkce podruhé (14.08.2006)
    Tipy a triky pro Oracle III. – analytické funkce poprvé (19.07.2006)
    Tipy a triky pro Oracle II. – jak na hierarchické struktury? (07.06.2006)
    Tipy a triky pro Oracle I. – jak na automatické přidělování ID? (05.05.2006)

    ( Celý článek! | Autor: David Krch | Počet komentářů: 1 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

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

    Nic 
     (1446 hl.)
    Do 1 000,- Kč 
     (1005 hl.)
    Do 10 000,- Kč 
     (950 hl.)
    Do 25 000,- Kč 
     (1207 hl.)
    Do 50 000,- Kč 
     (957 hl.)
    Do 75 000,- Kč 
     (1108 hl.)
    Více než 75 000,- Kč 
     (948 hl.)

    Celkem hlasovalo: 7621


    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ář
    <<  Září  >>
    PoÚtStČtSoNe
        123
    45678910
    11121314151617
    18192021222324
    252627282930 

    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