DATABÁZOVÉ A INFORMAˇCNÍ SYSTÉMY

Transkript

DATABÁZOVÉ A INFORMAˇCNÍ SYSTÉMY
Databázové a informační systémy – 2. PL/SQL II
1/52
DATABÁZOVÉ A INFORMAČNÍ SYSTÉMY
Michal Krátký, Radim Bača
Katedra informatiky
FEI
VŠB – Technická univerzita Ostrava
2012/2013
Databázové a informační systémy – 2. PL/SQL II
O BSAH
I
Triggery
I
Kurzory
I
Vázané proměnné
I
Práva běhu uložených procedur
I
Balíky
I
Hromadné SQL operace v PL/SQL
I
COMMIT
I
SQL Injection
2/52
Databázové a informační systémy – 2. PL/SQL II
3/52
Triggery
T RIGGER
I
Trigger je PL/SQL blok, který je spouštěn v závislosti na
nějakém DML příkazu jako je INSERT, UPDATE nebo
DELETE.
I
Obecně je možné triggery navěsit i na další operace (DML
nad pohledy, DDL příkazy, systémové události).
Databázové a informační systémy – 2. PL/SQL II
4/52
Triggery
T RIGGER , SYNTAXE
CREATE [OR REPLACE ] TRIGGER j m e n o _ t r i g g e r u
{BEFORE | AFTER | INSTEAD OF }
{ INSERT [OR] | UPDATE [OR] | DELETE}
[OF jmeno_sloupce ]
ON jmeno_tabulky
[ REFERENCING OLD AS s t a r a _ h o d n o t a NEW AS nova_hodnota ]
[FOR EACH ROW [WHEN ( podminka ) ] ]
BEGIN
p ř í k a z y
END;
Databázové a informační systémy – 2. PL/SQL II
5/52
Triggery
S YNTAXE , SPECIFIKACE SQL P ŘÍKAZU
I
Specifikace SQL operace, který spouští trigger: INSERT,
UPDATE, DELETE.
I
Můžeme použít víc operací.
I
OF jmeno_sloupce – trigger se spouští jen při
aktualizaci atributu jmeno_sloupce.
I
ON jmeno_tabulky – specifikujeme tabulku na kterou se
trigger váže.
Databázové a informační systémy – 2. PL/SQL II
Triggery
S YNTAXE , MÍSTO SPUŠT ĚNÍ TRIGGERU
I
Povinná část, specifikujeme ve kterou chvíli se má trigger
spouštět.
I
BEFORE - před provedením SQL příkazu.
I
AFTER - po provedením SQL příkazu.
I
INSTEAD OF - provedením místo SQL příkazu.
6/52
Databázové a informační systémy – 2. PL/SQL II
7/52
Triggery
FOR EACH ROW
[FOR EACH ROW [WHEN (podminka)]]
I
Implicitně se trigger spouští pouze jednou pro jeden příkaz
(který může měnit více záznamů).
I
Tímto volitelným parametrem specifikujeme, že trigger má
být spouštěn pro každý záznam, který je SQL příkazem
měněn.
I
Za WHEN můžeme dále specifikovat podmínku, při jejímž
splnění se má trigger spustit.
Databázové a informační systémy – 2. PL/SQL II
Triggery
P OJMENOVÁNÍ STARÝCH A NOVÝCH HODNOT
[REFERENCING OLD AS stara_hodnota NEW AS
nova_hodnota]
I
Volitelný parametr.
I
Umožňuje pojmenovat pomocí proměnné staré a nové
hodnoty záznamu se kterým manipulujeme.
I
Implicitně jsou tyto proměnné pojmenovány jako :OLD a
:NEW.
8/52
Databázové a informační systémy – 2. PL/SQL II
9/52
Triggery
P ŘÍKLAD
Při mazání záznamu z tabulky Student budeme mazaný
záznam ukládat do tabulky Hist_stud.
CREATE OR REPLACE TRIGGER d e l _ s t u d e n t
BEFORE DELETE ON s t u d e n t
FOR EACH ROW
BEGIN
INSERT INTO H i s t _ s t u d ( l o g i n , name , surname )
v a l u e s ( : OLD. l o g i n , :OLD. name , :OLD. surname )
END;
Databázové a informační systémy – 2. PL/SQL II
10/52
Triggery
P ROBLÉM MUTUJÍCÍCH TABULEK
I
Pokud se pokusíme v triggeru číst či modifikovat stejnou
tabulku dostaneme mutating table error (i.e. ORA-04091).
I
Takovému triggeru bychom se měli vyhnout, existují ovšem
techniky, které umožní podobnou funkcionalitu provést.
Databázové a informační systémy – 2. PL/SQL II
11/52
Kurzory
K URZORY
Kurzory jsou pomocné proměnné vytvořené po provedení
nějakého SQL příkazu. Tyto pomocné proměnné nám umožní
procházet výsledek příkazu. Existují dva typy kurzorů:
I
Implicitní kurzor – vytváří se automaticky po provedení
příkazů jako INSERT, DELETE nebo UPDATE.
I
Explicitní kurzor – definuje se již v definiční části procedury
podobně jako proměnná. Takový kurzor je často spojen s
příkazem SELECT, který vrací více než jeden řádek.
Databázové a informační systémy – 2. PL/SQL II
Kurzory
Explicitní kurzor
E XPLICITNÍ KURZOR
I
Definice explicitního kurzoru má následující syntaxi:
CURSOR jmeno_kursoru IS prikaz_select;
I
Kde prikaz_select vrací množinu záznamů.
I
Pomocí kurzoru můžeme postupně procházet jednotlivé
záznamy výsledku SELECT příkazu a pracovat s
jednotlivými hodnotami výsledku.
I
V každém kroku programu ukazuje kurzor pouze na jeden
záznam výsledku.
12/52
Databázové a informační systémy – 2. PL/SQL II
Kurzory
Explicitní kurzor
P RÁCE S EXPLICITNÍM KURZOREM
Práce s kurzorem probíhá pomocí následujících příkazů:
I
OPEN jmeno_kurzoru – otevírá kurzor. Prakticky
provádí SQL příkaz spojený s kurzorem a nastaví kurzor
na první záznam výsledku.
I
FETCH jmeno_kurzoru INTO promenna_zaznam –
načítá aktuální záznam kurzoru do proměnné
promenna_zaznam a posune se na další záznam.
I
CLOSE jmeno_kurzoru – zavírá kursor.
13/52
Databázové a informační systémy – 2. PL/SQL II
Kurzory
Explicitní kurzor
P ŘÍKLAD
Následujícím kurzorem načítáme příjmení všech záznamů z
tabulky Student.
DECLARE
CURSOR c_surname IS SELECT ∗ FROM Student ;
v _ r e c o r d Student%ROWTYPE;
v_tmp INTEGER : = 0 ;
BEGIN
OPEN c_surname ;
LOOP
FETCH c_surname INTO v _ r e c o r d ;
EXIT WHEN c_surname%NOTFOUND;
v_tmp : = c_surname%ROWCOUNT;
DBMS_OUTPUT. PUT_LINE ( v_tmp | | v _ r e c o r d . surname ) ;
END LOOP;
CLOSE c_surname ;
END;
14/52
Databázové a informační systémy – 2. PL/SQL II
Kurzory
Explicitní kurzor cyklem FOR
E XPLICITNÍ KURZOR CYKLEM FOR
I
O něco jednodušší je práce s kurzorem při použití cyklu
FOR. medskip
I
V tomto případě nemusíme kurzor explicitně uzavírat
pomocí CLOSE.
15/52
Databázové a informační systémy – 2. PL/SQL II
16/52
Kurzory
Explicitní kurzor cyklem FOR
P ŘÍKLAD , VARIANTA 1
Následujícím kurzorem načítáme příjmení všech záznamů z
tabulky Student.
DECLARE
CURSOR c_surname IS SELECT surname FROM Student ;
v_surname Student . surname%TYPE ;
v_tmp NUMBER : = 0 ;
BEGIN
FOR one_surname IN c_surname LOOP
v_tmp : = c_surname%ROWCOUNT;
v_surname : = one_surname . surname ;
DBMS_OUTPUT. PUT_LINE ( v_tmp | | ’ ’ | | v_surname ) ;
END LOOP;
END;
Databázové a informační systémy – 2. PL/SQL II
17/52
Kurzory
Explicitní kurzor cyklem FOR
P ŘÍKLAD , VARIANTA 2
Zde vidíme variantu kurzoru s cyklem FOR, kde nedeklarujeme
proměnnou typu CURSOR.
DECLARE
v_surname Student . surname%TYPE ;
v_tmp NUMBER : = 0 ;
BEGIN
FOR one_surname IN (SELECT surname FROM Student )
LOOP
v_tmp : = v_tmp + 1 ;
v_surname : = one_surname . surname ;
DBMS_OUTPUT. PUT_LINE ( v_tmp | | ’ ’ | | v_surname ) ;
END LOOP;
END;
Databázové a informační systémy – 2. PL/SQL II
18/52
Kurzory
OPEN/FETCH/CLOSE vs FOR
OPEN/FETCH/CLOSE VS FOR
I
Přestože cyklus FOR má na první pohled jednodušší zápis
a rovněž nemusíme myslet na uzavíraní příkazem CLOSE,
nebyl dříve doporučen při práci s větším množstvím
záznamů.
I
FETCH se prováděl po jednotlivých záznamech.
I
Doporučoval se explicitní kurzor a čtení více záznamů
současně do pole (FETCH BULK INTO).
I
Od verze Oracle 10g se na pozadí načítají záznamy po
100 do bufferu.
I
Vzhledem k jednoduššímu zápisu, je tedy vhodnější použít
u novějších verzích SŘBD Oracle cyklus FOR.
Databázové a informační systémy – 2. PL/SQL II
Vázané proměnné
Z PRACOVÁNÍ DOTAZU
Uvažujme situaci kdy posíláme na databázový systém tisíce
příkazů SELECT jako např.:
SELECT fname , lname , address FROM Student
WHERE l o g i n = ’ kra228 ’ ;
19/52
Databázové a informační systémy – 2. PL/SQL II
20/52
Vázané proměnné
Z PRACOVÁNÍ DOTAZU
Databázový systém nejprve kontroluje zda příkaz již nebyl dříve
zaslán.
I
I
1
Pokud byl poslán poprvé:
I
Každý zaslaný dotaz je parsován a je pro něj vytvořen plán
vykonávání dotazu1 .
I
Dotaz může být vykonán mnoha způsoby, systém hledá ten
nejefektivnější.
I
Tento proces může v některých případech trvat déle než
samotné vykonání dotazu.
Pokud byl dotaz již dříve poslán: SŘBD využije již dříve
sestavený plán vykonávání dotazu.
Viz pozdější přednášky a předmět Databázové systémy
Databázové a informační systémy – 2. PL/SQL II
21/52
Vázané proměnné
KONTROLA JEDINE ČNOSTI DOTAZU
I
I
Při kontrole zda stejný dotaz nebyl již dříve odeslán na
systém, SŘBD kontroluje celý řetězec dotazu.
Tyto dotazy tedy nejsou identické a pro druhý dotaz opět
proběhne zpracování dotazu:
SELECT fname ,
WHERE l o g i n
SELECT fname ,
WHERE l o g i n
I
I
lname , address FROM Student
= ’ kra228 ’ ;
lname , address FROM Student
= ’ fer452 ’ ;
Celý problém se typicky ukáže ve chvíli kdy systém
obsahuje ostrá (často rozsáhlá data) a k systému začne
přistupovat více uživatelů.
Jelikož firemní informační systémy se nepíšou pro jednoho
uživatele a jednotky záznamů, musíme umět psát kód
maximálně efektivně.
Databázové a informační systémy – 2. PL/SQL II
22/52
Vázané proměnné
VÁZANÉ PROM ĚNNÉ
I
Vázané proměnné nám umožní využít již vytvoření plán
vykonávání dotazu pro dotazy, které se liší v zadaných
hodnotách.
I
Vázané proměnné jakou jakési substituční proměnné,
které používáme namísto literálů, např.:
SELECT fname , lname , address FROM Student
WHERE l o g i n = : l o g i n ;
I
Tyto proměnné mají stejný efekt jako bychom na databázi
poslali totožné dotazy, přestože za proměnou dosazujeme
různé hodnoty.
I
Snižujeme čas vykonávání dotazu a tedy i zátěž systému
(a zvyšujeme propustnost).
Databázové a informační systémy – 2. PL/SQL II
Vázané proměnné
S TATICKÉ PL/SQL
I
Statické PL/SQL automaticky používá vázané proměnné,
např.:
CREATE OR REPLACE PROCEDURE
l o g i n I n t o S y s t e m ( p _ l o g i n IN VARCHAR)
AS
num INT ;
BEGIN
SELECT COUNT( ∗ ) INTO num FROM Student
WHERE l o g i n = p _ l o g i n ;
...
END;
/
I
Každá proměnná použitá ve statickém PL/SQL je vázaná
proměnná.
23/52
Databázové a informační systémy – 2. PL/SQL II
24/52
Vázané proměnné
DYNAMICKÉ PL/SQL
I
I
V případě dynamického PL/SQL (řetězce, které spouštíme
příkazem EXECUTE IMMEDIATE) takové proměnné k
dispozici implicitně nemáme.
Typické vytváření dotazu pomocí spojování řetězců vyústí
v neefektivní zpracování každého dotazu v SŘBD, např.:
CREATE OR REPLACE PROCEDURE
updateClass ( p _ l o g i n IN VARCHAR)
AS
BEGIN
EXECUTE IMMEDIATE
’UPDATE Student c l a s s = c l a s s + 1
WHERE l o g i n = ’ | | p _ l o g i n ;
COMMIT;
END;
/
Databázové a informační systémy – 2. PL/SQL II
Vázané proměnné
DYNAMICKÉ PL/SQL
I
Vázání proměnné s proměnnou v řetězci u dynamického
PL/SQL provedeme klíčovým slovem USING, např.:
CREATE OR REPLACE PROCEDURE
updateClass ( p _ l o g i n IN VARCHAR)
AS
BEGIN
EXECUTE IMMEDIATE
’UPDATE Student c l a s s = c l a s s + 1
WHERE l o g i n = : x ’ USING p _ l o g i n ;
COMMIT;
END;
/
I
Upozornění: vázané proměnné můžeme použít pouze u
literálů (hodnoty atributů), tedy ne např. pro dynamicky
získávané jméno tabulky (zde musíme použít spojení
řetězců).
25/52
Databázové a informační systémy – 2. PL/SQL II
26/52
Vázané proměnné
P OROVNÁNÍ VÝKONU
I
Zadání: napište anonymní proceduru, které bude vypisovat
názvy objektů z tabulky ALL_OBJECTS pro objekty s id
1 – 1000.
I
Budeme testovat výkon při použití i bez použití vázaných
proměnných.
Databázové a informační systémy – 2. PL/SQL II
Vázané proměnné
P ŘÍKLAD , BEZ VÁZANÝCH PROM ĚNNÝCH 1/2
DECLARE
TYPE r c IS REF CURSOR;
v_rc rc ;
v_dummy ALL_OBJECTS .OBJECT_NAME%t y p e ;
v _ s t a r t NUMBER DEFAULT DBMS_UTILITY . GET_TIME ;
BEGIN
FOR i IN 1 . . 1000
LOOP
OPEN v _ r c FOR
’ s e l e c t object_name from a l l _ o b j e c t s
where o b j e c t _ i d = ’ | | i ;
FETCH v _ r c INTO v_dummy ;
CLOSE v _ r c ;
−− DBMS_OUTPUT. PUT_LINE ( v_dummy ) ;
END LOOP;
27/52
Databázové a informační systémy – 2. PL/SQL II
28/52
Vázané proměnné
P ŘÍKLAD , BEZ VÁZANÝCH PROM ĚNNÝCH 2/2
DBMS_OUTPUT. PUT_LINE ( round (
( DBMS_UTILITY . GET_TIME−v _ s t a r t ) / 1 0 0 , 2 ) | |
END;
/
’ s ’ );
Poznámka: DBMS_UTILITY.GET_TIME vrací hodnotu čítače v
setinách sekund od začátku nějakého období.
Databázové a informační systémy – 2. PL/SQL II
Vázané proměnné
P ŘÍKLAD , POUŽITÍ VÁZANÝCH PROM ĚNNÝCH 1/2
DECLARE
TYPE r c IS REF CURSOR;
v_rc rc ;
v_dummy ALL_OBJECTS .OBJECT_NAME%t y p e ;
v _ s t a r t NUMBER DEFAULT DBMS_UTILITY . GET_TIME ;
BEGIN
FOR i IN 1 . . 1000
LOOP
OPEN v _ r c FOR
’ s e l e c t object_name from a l l _ o b j e c t s
where o b j e c t _ i d = : x ’ USING i ;
FETCH v _ r c INTO v_dummy ;
CLOSE v _ r c ;
−− DBMS_OUTPUT. PUT_LINE ( v_dummy ) ;
END LOOP;
29/52
Databázové a informační systémy – 2. PL/SQL II
30/52
Vázané proměnné
P ŘÍKLAD , POUŽITÍ VÁZANÝCH PROM ĚNNÝCH 2/2
DBMS_OUTPUT. PUT_LINE ( round (
( DBMS_UTILITY . GET_TIME−v _ s t a r t ) / 1 0 0 , 2 ) | |
END;
/
’ s ’ );
Databázové a informační systémy – 2. PL/SQL II
Vázané proměnné
P OROVNÁNÍ VÝKONU
I
Čas bez využití vázaných proměnných: 65.48s.
I
Čas s využitím vázaných proměnných: 0.25s.
I
Nevyužívání vázaných proměnných je tedy značně
neefektivní!
31/52
Databázové a informační systémy – 2. PL/SQL II
32/52
Vázané proměnné
VÁZANÉ PROM ĚNNÉ V DALŠÍCH PROGRAMOVACÍCH
JAZYCÍCH A S ŘBD
I
C# (ADO.NET) a Java (JDBC) rovněž podporují vázané
proměnné.
I
V tomto případě se jim říká parametrizované nebo
předpřipravené dotazy (např. v Javě máme k dispozici
třídu PreparedStatement).
I
Popisované vlastnosti nejsou závislé pouze na SŘBD
Oracle, ale jsou platné pro další SŘBD (např. SQL Server).
Databázové a informační systémy – 2. PL/SQL II
Hromadné SQL operace v PL/SQL
H ROMADNÉ SQL OPERACE V PL/SQL
I
Typické (neefektivní) vkládání většího počtu záznamů je
vkládání po jednom záznamu.
I
U většiny SŘBD můžeme ale využít tzv. hromadných
operací.
I
Vkládáním většího počtu záznamů najednou snížíme režii
zotavení (zápis do logu) a datových struktur (menší počet
aktualizací diskových stránek).
I
Výsledkem je rychlejší vkládání záznamů.
I
Lze použít pro statické i dynamické SQL.
I
U SŘBD Oracle používáme operace BULK COLLECT a
FORALL.
33/52
Databázové a informační systémy – 2. PL/SQL II
Hromadné SQL operace v PL/SQL
BULK COLLECT
I
BULK COLLECT říká SQL enginu aby navázal výstupní
kolekci s PL/SQL enginem.
I
BULK LOAD používáme zejména s příkazem SELECT
INTO.
I
Syntaxe je následující:
... BULK COLLECT INTO collection_name[,
collection_name] ...
34/52
Databázové a informační systémy – 2. PL/SQL II
Hromadné SQL operace v PL/SQL
FORALL
I
(Nejedná se o cyklus.)
I
FORALL říká PL/SQL enginu aby navázal vstupní kolekci
před jejím posláním do SQL enginu.
I
Syntaxe:
FORALL index IN lower_bound..upper_bound
sql_statement;
I
Kde:
I
I
I
index je index pole
sql_statement je INSERT, UPDATE nebo DELETE
lower_bound..upper_bound ohraničuje index pole
35/52
Databázové a informační systémy – 2. PL/SQL II
36/52
Hromadné SQL operace v PL/SQL
P ŘÍKLAD
DECLARE
TYPE NumTab IS TABLE OF employees . employee_id%TYPE ;
TYPE NameTab IS TABLE OF employees . last_name%TYPE ;
enums NumTab ;
names NameTab
BEGIN
SELECT employee_id , last_name
BULK COLLECT INTO enums , names
FROM employees WHERE employee_id > 1000;
...
FORALL i IN enums . FIRST . . enums . LAST
UPDATE myemp SET name = names ( i )
WHERE employee=enums ( i ) ;
Databázové a informační systémy – 2. PL/SQL II
37/52
Hromadné SQL operace v PL/SQL
E FEKT HROMADNÉHO VKLÁDÁNÍ DAT2
Příklad:
I
Vložení 100 000 záznamů do tabulky s primárním klíčem.
I
Porovnání vkládání po 1 záznamu a v dávkách po 10 000.
Celkový čas [s]
Vkládání po
1 záznamů
7
Hromadné
vkládání
0,9
Zlepšení hromadného vkládání je 87% (7.7×)!
Pokud můžete, používejte hromadné operace!
2
(c) David Krch, Oracle ČR: PL/SQL
Rozdíl
6.1
Databázové a informační systémy – 2. PL/SQL II
Další rysy PL/SQL
Balíky
BALÍKY 1/2
I
Balíky mají podobnou funkci jako knihovny v jiných
programovacích jazycích.
I
Shlukují PL/SQL objekty (funkce, procedury, proměnné,
výjimky atd.) do jednoho místa.
38/52
Databázové a informační systémy – 2. PL/SQL II
Další rysy PL/SQL
Balíky
BALÍKY 2/2
I
Balíky mají hned několik výhod:
I
Umožňují deklarovat proměnné a výjimky která jsou
dostupné i mimo proceduru či funkci.
I
Vytvoření veřejných a privátních funkcí a procedur.
Pomocné (privátní) PL/SQL bloky tedy bude možné volat
jen z procedur a funkcí uvnitř balíku.
I
Vytvoření vlastního jmenného prostoru, kde je možné mít
libovolná jména PL/SQL objektů.
I
Snadnější orientace v PL/SQL kódu. Výhodné zejména u
větších projektů.
39/52
Databázové a informační systémy – 2. PL/SQL II
40/52
Další rysy PL/SQL
Balíky
BALÍKY
I
Balíky jsou vytvářeny ve dvou částech: specifikace balíku
a tělo balíku.
I
Specifikace balíku představuje veřejnou část, která je
dostupná nejen uvnitř balíku. Obsahuje definice veřejných
proměnných, výjimek a hlaviček procedur a funkcí.
I
Tělo balíku pak obsahuje neveřejnou část balíku a definice
procedur a funkcí deklarovaných ve specifikaci balíku.
Databázové a informační systémy – 2. PL/SQL II
41/52
Další rysy PL/SQL
Balíky
BALÍKY
Specifikace balíku:
CREATE [OR REPLACE ] PACKAGE package_name IS | AS
v e ř e j n é d e k l a r a c e podprogram ů , t y p ů a prom ěnných
END [ package_name ] ;
Tělo balíku:
CREATE [OR REPLACE ] PACKAGE BODY package_name IS | AS
p r i v á t n í č á s t b a l í k u
END [ package_name ] ;
Databázové a informační systémy – 2. PL/SQL II
Další rysy PL/SQL
Práva běhu uložených procedur
P RÁVA B ĚHU ULOŽENÝCH PROCEDUR
I
Implicitně běží kód uložených procedur/funkcí/balíčků s
právy vlastníka (tedy toho kdo proceduru vytvořil).
I
Tento režim se označuje AUTHID DEFINER.
I
Aktuální schéma = schéma vlastníka procedury.
I
Druhou možností je, aby kód běžel s právy aktuálního
uživatele (tedy ten kdo proceduru spustil).
I
Volba: AUTHID CURRENT_USER (od Oracle 8i)
I
aktuální schéma = schéma aktuálního uživatele
42/52
Databázové a informační systémy – 2. PL/SQL II
Další rysy PL/SQL
Práva běhu uložených procedur
P ŘÍKLAD
CREATE TABLE s t u d (
id
INT p r i m a r y key NOT NULL,
lname VARCHAR2( 5 0 ) NOT NULL ) ;
CREATE OR REPLACE PROCEDURE myproc ( a IN OUT VARCHAR)
AUTHID CURRENT_USER AS
BEGIN
SELECT lname i n t o a FROM s t u d WHERE i d =1;
END;
−− s p u s t e n i
DECLARE
a VARCHAR( 5 0 ) ;
BEGIN
myproc ( a ) ;
END;
43/52
Databázové a informační systémy – 2. PL/SQL II
Další rysy PL/SQL
COMMIT
COMMIT
I
Oracle podporuje tyto volby příkazu COMMIT
COMMIT [WRITE [WAIT | NOWAIT] [IMMEDIATE |
BATCH]]
I
Pokud jsou aktualizována data důležitá použijeme WAIT:
I
COMMIT čeká než dojde k zápisu do REDO logu.
I
⇒ Je zaručeno korektní potvrzení aktualizací.
44/52
Databázové a informační systémy – 2. PL/SQL II
Další rysy PL/SQL
COMMIT
COMMIT
I
Oracle podporuje tyto volby příkazu COMMIT
COMMIT [WRITE [WAIT | NOWAIT] [IMMEDIATE |
BATCH]]
I
V případě NOWAIT může dojít ke ztrátě dat:
I
COMMIT vyžádá zápis do REDO logu, ale nečeká.
I
Data jsou zpřístupněna ostatním transakcím.
I
K zápisu do REDO logu může dojít s mírným zpožděním –
po určitou dobu je možná ztráta dat transakce!
I
Může mít smysl tam, kde je podstatná maximální
propustnost (počet transakcí za čas), ale cena 1 ztracená
transakce je nízká – např. zasílání zpráv.
45/52
Databázové a informační systémy – 2. PL/SQL II
Další rysy PL/SQL
Útok SQL Injection
Ú TOK SQL I NJECTION
I
Text získaný od uživatele (resp. vně systému), např. z
webového formuláře:
I
Pomocí spojení řetězců pak vytvoříme dotaz, např.:
OPEN c FOR
’SELECT fname , lname , s a l a r y ’
| | ’FROM employees ’
| | ’WHERE lname = ’ ’ ’ | | p_lname
|| ’ ’ ’ ’;
46/52
Databázové a informační systémy – 2. PL/SQL II
Další rysy PL/SQL
Útok SQL Injection
Ú TOK SQL I NJECTION
I
Pokud uživatel (v tomto případě útočník) zadá místo
příjmení například: X’ or 1=1 --
I
Výsledkem je řetězec:
SELECT fname , lname , s a l a r y
FROM employees
WHERE lname = ’X ’ o r 1=1 −−’
I
3
Combo boxy formuláře nic neřeší, útočník může napsat
text do přímo do URL3 :
http://server/stranka?vstup=X’ or 1=1 --
(Hodnota v ukázce není zakódovaná: mezery → %20, atd.)
47/52
Databázové a informační systémy – 2. PL/SQL II
48/52
Další rysy PL/SQL
Útok SQL Injection
JAK SE VYHNOUT SQL I NJECTION V PL/SQL?
I
Když to jde, používejte statické dotazy.
I
V dynamických dotazech používejte vázané proměnné pro
nastavení hodnoty atributu.
I
Pod daným uživatelem v databázi nemějte vytvořené
tabulky, které nenáleží k dané aplikaci (tj. nastavte správné
řízení přístupu). Tímto opatřením budete minimalizovat
následky útoku.
Databázové a informační systémy – 2. PL/SQL II
49/52
Další rysy PL/SQL
Útok SQL Injection
JAK SE VYHNOUT SQL I NJECTION V PL/SQL?
I
Tam kde hodnota od uživatele ovlivňuje řetězec dotazu (tj.
nelze použít vázané proměnné):
I
Nepoužívejte hodnotu přímo (např. převod řetězce
získaného od uživatele na číslo).
I
Pokud bude text od uživatele použit jako jméno objektu z
databáze (např. tabulky), zkontrolujte či upravte text (může
obsahovat potencionálně nebezpečné znaky ’ nebo ")
pomocí DBMS_ASSERT nebo zkontrolujte existenci
objektu v systémovém katalogu (např. USER_TABLES).
Databázové a informační systémy – 2. PL/SQL II
50/52
Další rysy PL/SQL
Útok SQL Injection
JAK SE VYHNOUT SQL I NJECTION ?
Používejte vázané proměnné.
I
Nepoužívejte:
’SELECT ∗ FROM employees
WHERE fname = ’ ’ ’ | | p_fname | |
’ ’ ’ AND lname = ’ ’ ’ | | p_lname | |
I
Používejte:
’SELECT ∗ FROM employees
WHERE fname = : 1 AND lname = : 2 ’ ;
Zamezíte SQL Injection.
’ ’ ’ ’;
Databázové a informační systémy – 2. PL/SQL II
?
I
Má smysl psát logiku aplikace v PL/SQL?
I
Rozhodně ano!
I
Jsme nejblíž databázi, na straně klienta efektivitu nemůže
ovlivnit v takové míře jako v PL/SQL.
I
Postup:
I
I
I
I
4
Co jde napsat v SQL, napište v SQL.
Co nejde napsat v SQL, napište ve statickém PL/SQL4 .
Co nejde napsat ve statickém PL/SQL, napište v
dynamickém PL/SQL.
Co nejde napsat v PL/SQL, napište v klientské aplikaci.
Nebo jiném procedurálním rozšíření SQL.
51/52
Databázové a informační systémy – 2. PL/SQL II
R EFERENCE
I
I
Portál materiálů k Oracle:
http://www.oracle.com/pls/
db112/portal.all_books:
I
PL/SQL Language Reference
I
PL/SQL Packages and Types Reference
Bind variables - The key to application performance,
http://www.akadia.com/services/ora_bind_variables.html,
2010.
52/52

Podobné dokumenty

Nové vlastnosti IDS 11.50

Nové vlastnosti IDS 11.50 FOR A2 = 1 TO 100 LET A3 = A0 || A2 || A1; EXECUTE IMMEDIATE A3 ; END FOR; SELECT COUNT(DISTINCT C1) INTO A4 FROM T1; RETURN A4; END PROCEDURE; -- should return 100 as 100 unique values got -- inse...

Více

Databázové systémy I.

Databázové systémy I. uvedeny za klauzuli GROUP BY. Omezení výsledku skupinového dotazu lze pomoci klauzule HAVING podmínka_pro_agregované_veličiny. Omezení za klauzuli HAVING se aplikuji až po vytvoření skupin.

Více

Geo ckych pruzkumu objektu

Geo ckych pruzkumu objektu obzory v oboru architektury a památkových objektů. Dalším důvodem pak byla možnost seznámit se podrobněji se současným stavem 3D (troj dimenzionálních) technologií, které do geografických informačn...

Více

DATABÁZOVÉ A INFORMAˇCNÍ SYSTÉMY

DATABÁZOVÉ A INFORMAˇCNÍ SYSTÉMY Programátor oznamuje transakčnímu manageru, že transakce byla úspěšně dokončena, databáze je nyní v korektním stavu, a všechny změny provedené v rámci transakce mohou být trvale uloženy v data...

Více

CZTvorba obsahu

CZTvorba obsahu v současnosti používaných potíže nemá, pouze Internet Explorer tuto funkci podporuje až od verze 10). Typicky je u nahrávaného snímku vyžadována minimální velikost potřebná pro vybraný styl.

Více

Freedom / IQ

Freedom / IQ Vynikající vlastnosti židle Freedom / IQ mohou být využívány s minimální potřebou nastavování ovládacích prvků. Židle Freedom / IQ definuje novou úroveň pracovních standardů umožňující nové způsoby...

Více

Všeobecné smluvní podmínky

Všeobecné smluvní podmínky 2.7 Poskytovatel je oprávněn v průběhu trvání smlouvy změnit tyto smluvní podmínky nebo ceník doplňkových služeb. Taková změna bude oznámena na internetových stránkách poskytovatele, a to nejpozděj...

Více