IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

3. diel - Oracle krok za krokom: Vkladanie a mazanie dát v tabuľke

V minulej lekcii, Oracle krok za krokom: Vytvorenie schémy a tabuľky , sme si ukázali, ako vytvoriť schému a tabuľku.

Dnes budeme vkladať a mazať záznamy, teda používateľa.

Pred začatím samotnej lekcie by som vás chcel informovať, že tu budeme, čo sa týka dátumu atp., Pracovať s českou lokalizáciou pre SQL Developer. Ak je napr. Váš operačný systém v angličtine, pre tento kurz vám odporúčam si v SQL Developer zmeniť preferencie na českej. Je to možné skrze menu Tools -> Preferences -> Database -> NLS. Ideálne by ste mali mať všetko rovnako, ako na obrázku nižšie:

Oracle

Ak máme hotovo, prejdeme teraz k obsahu samotnej lekcie:

Vloženie zápisu do tabuľky

Vloženie nového užívateľa si ukážeme opäť najprv cez SQL Worksheet. Rozkliknite si tabuľku UZIVATELE. Zobrazí sa nám prehľad našej tabuľky. Z hornej lišty prehľadu tabuľky potom vyberieme položku Dáta a klikneme na tlačidlo Insert Row (tretí zľava) alebo využijeme klávesovú skratku CTRL + I. Do tabuľky sa nám teraz vložil prázdny riadok (nahrávanie). Následne vyplníme dáta záznamu, pričom musíme myslieť na to, o aký dátový typ sa jedná:

Oracle

Pozn .: Vkladanie ID manuálne nie je príliš praktické, ale pre túto lekciu si s tým vystačíme. Neskôr v kurze si ukážeme, ako nastaviť, aby sa nám ID záznamov vkladalo a navyšovalo automaticky.

Teraz už len stačí kliknúť na tlačidlo Commit Changes (piate zľava), alebo stlačiť kláves F11, čím potvrdíme vloženie zápisu do tabuľky. Ak sme všetky hodnoty zadali správne, záznam sa pridá do tabuľky, a SQL Developer nám túto skutočnosť oznámi v logu:

Oracle

Rovno si môžeme všimnúť, že sme využili ďalšie SQL dotaz - INSERT. Vložiť Pavla Novotného by sme mohli rovnako aj týmto dotazom:

INSERT INTO UZIVATELE (
    UZIVATELE_ID,
    JMENO,
    PRIJMENI,
    DATUM_NAROZENI,
    POCET_CLANKU
)
VALUES (
    1, 'Pavel',  'Novotný',  '1.1.1999', 0
);

Prvý riadok je opäť jasný, proste hovoríme "Vlož do používateľov", ďalšie riadky sú stĺpce, v ktorých bude mať nová položka nejaké hodnoty. Nasleduje klauzula VALUES a ďalšie výpočet prvkov v zátvorkách, tentoraz hodnôt. T y idú v tom poradí, aké sme uviedli u názvov stĺpcov. Textové hodnoty sú v úvodzovkách alebo apostrofmi, všetky hodnoty oddeľujeme čiarkami.

Pokiaľ vkladáme do SQL dotazu text (tu treba meno používateľa), nesmie obsahovať úvodzovky, apostrofy a pár ďalších znakov. Tieto znaky samozrejme do textu zapísať môžeme, len sa musí ošetriť, aby si databázy nemyslela, že ide o časť dotazu. Ešte sa k tomu vrátime.

Teraz si pomocou SQL dotazu vložíme niekoľko užívateľov naraz. Využijeme na to INSERT ALL. SQL dotaz bude vyzerať napríklad takto:

INSERT ALL
INTO UZIVATELE (
    UZIVATELE_ID, JMENO, PRIJMENI, DATUM_NAROZENI, POCET_CLANKU
)
VALUES (
    2, 'Karel',  'Novák',  '25.6.1979', 10
)
INTO UZIVATELE (
    UZIVATELE_ID, JMENO, PRIJMENI, DATUM_NAROZENI, POCET_CLANKU
)
VALUES (
    3, 'Adam',  'Mladý',  '12.8.2001', 2
)
INTO UZIVATELE (
    UZIVATELE_ID, JMENO, PRIJMENI, DATUM_NAROZENI, POCET_CLANKU
)
VALUES (
    4, 'Petr',  'Starý',  '13.4.1992', 18
)
SELECT 1 FROM DUAL;

Otázka SELECT 1 FROM DUAL na konci dopytu teraz viac rozoberať nebudeme. Povieme si len, že dotaz INSERT ALL vyžaduje poddotaz SELECT, ktorý mu práve týmto riadkom poskytujeme.

Záznamy o užívateľoch v tabuľke UZIVATELE budú teda vyzerať takto:

Oracle

Vymazanie záznamu

Skúsme si niekoho vymazať. V prehľade tabuľky zvolíme záznam, ktorý chceme odstrániť a na lište klikneme na červený krížik. Potom zmenu v tabuľke opäť musíme potvrdiť kliknutím na tlačidlo Commit Changes.

Odstránenie záznamu sa v jazyku SQL robí pomocou príkazu DELETE:

DELETE FROM UZIVATELE WHERE UZIVATELE_ID = 4;

Príkaz je jednoduchý, voláme "vymaž z užívateľov", kde sa hodnota v stĺpci UZIVATELE_ID rovná 4. Zamerajme sa na klauzulu WHERE, ktorá definuje podmienku. Stretneme ju aj v ďalších otázkach. Keďže tu natierame podľa primárneho kľúča, sme si istí, že vždy vymažeme práve jedného používateľa. Podmienku samozrejme môžeme rozvinúť, závorkovat a používať operátormi AND (a zároveň) a OR (alebo):

DELETE FROM UZIVATELE WHERE (JMENO = 'Pavel' AND DATUM_NAROZENI >= '1.1.1980') OR (POCET_CLANKU > 5);

Príkaz vyššie vymaže všetky Pavly, ktorí boli narodení po roku 1980 alebo všetkých užívateľov, ktorí napísali viac ako 5 článkov.

POZOR!, Nikdy na klauzulu WHERE nezabudnite, ak napíšete len:

DELETE FROM UZIVATELE;

Budú vymazaní všetci užívatelia v tabuľke!

SQL injection

SQL injection je termín, označujúci narušenie databázového dopytu škodlivým kódom od užívateľa.

Predstavme si, že naša tabuľka s užívateľmi je súčasťou databázy nejakej aplikácie. A tiež, že umožníme užívateľovi (našej aplikácie) mazať užívateľa podľa priezviska. Do dotazu vložíme teda nejakú premennú, ktorá pochádza od užívateľa:

DELETE FROM UZIVATELE WHERE PRIJMENI = $prijmeni;

$prijmeni je premenná obsahujúca potrebné tento text:

Novák

Otázka sa teda utvorí takto:

DELETE FROM UZIVATELE WHERE PRIJMENI = 'Novák';

Dotaz sa vykoná a vymaže všetky Nováky. To znie ako to, čo sme chceli. Teraz si ale predstavte, čo sa stane, keď niekto do premennej zadá toto:

' OR 1 --

Výsledný dotaz bude vyzerať takto:

DELETE FROM UZIVATELE WHERE PRIJMENI = '' OR 1 --';

Pretože 1 je z logického hľadiska vždy pravda a v podmienke je, že buď musí mať užívateľ prázdne priezvisko alebo musí platiť pravda (čo platí), vymaže dotaz všetkých užívateľov v tabuľke. Posledný úvodzovky sa útočník zbavil komentárom (dve pomlčky), ktorý v dotaze zruší všetko do konca riadku.

Šikovnejší útočníci dokážu urobiť injekciu v ktoromkoľvek SQL príkazu, nielen v DELETE.

Riešenie

Nebojte, riešenie je veľmi jednoduché. Problém robí niekoľko špeciálnych znakov v premennej, ako sú úvodzovky a niekoľko ďalších. Ak tieto znaky potrebujeme, musíme ich tzv. Odescapovat, teda predsadiť spätným lomítkom. V aplikácii to za nás nejakým spôsobom rieši ovládač databázy, buď to robí úplne sám alebo dáta musíme pomocou neho pred vložením do dotazu najprv odescapovat. Určite si to zistite, ako začnete s databázou pracovať. Ak budete používať tunajšie návody, bude to v nich vždy uvedené.

Odescapovaný dotaz by vyzeral takto:

DELETE FROM UZIVATELE WHERE PRIJMENI = '\' OR 1 --';

Takýto dotaz je neškodný, pretože časť vložená užívateľom je považovaná ako text. V texte sa nevyhodnotí úvodzovky a tým pádom ani komentár. Ďalším variantom, ako aplikáciu zabezpečiť proti injekciu, je obsah premennej do dotazu vôbec nezadávať. V dotaze sú potom uvedené iba zástupné znaky (otázniky):

DELETE FROM UZIVATELE WHERE PRIJMENI = ?;

A premenné sa pošlú databázu potom zvlášť a naraz. Ona si ich tam sama navkládá tak, aby nevzniklo žiadne nebezpečenstvo. To je však teória okolo konkrétneho ovládača databázy a ako bolo povedané, nájdete ju u jazyka, z ktorého budete s databázou komunikovať (napr. V sekcii PHP).

Editácia záznamov

Databáza umožňuje 4 základné operácie, ktoré sú často označované skratkou CRUD (C reate, R ead, U pdate, D élet). Sú to teda vytvorenie záznamu, načítanie (vyhľadanie), update (editácia) a vymazanie záznamu. Vytvorenie a vymazanie už vieme. Chýba nám teda ešte editácie a vyhľadávania. Vyhľadávanie venujeme celý budúci článok, editáciu si vysvetlíme ešte dnes.

Editácia záznamu skrze SQL Worksheet je veľmi jednoduchá, jednoducho dvakrát klikneme na údaj, ktorý chceme upraviť a napíšeme novú hodnotu. Zmenu potom opäť nesmieme zabudnúť potvrdiť tlačidlom Commit Changes.

UPDATE UZIVATELE SET PRIJMENI = 'Dolejší', POCET_CLANKU  = POCET_CLANKU + 1 WHERE UZIVATELE_ID = 3;

Za kľúčovým slovom UPDATE nasleduje názov tabuľky, potom slovo SET a vždy názov stĺpca = hodnota. Môžeme meniť hodnoty viac stĺpcov, iba sa oddelí čiarkou. Môžeme dokonca použiť predchádzajúca hodnotu z databázy a treba ju zvýšiť o 1, ako v ukážke vyššie.

V budúcej lekcii, Oracle krok za krokom: Vývoz , si ukážeme rôzne typy exportov databázy.


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 281x (972 B)

 

Predchádzajúci článok
Oracle krok za krokom: Vytvorenie schémy a tabuľky
Všetky články v sekcii
Oracle
Preskočiť článok
(neodporúčame)
Oracle krok za krokom: Vývoz
Článok pre vás napísal Matěj Kadlec
Avatar
Užívateľské hodnotenie:
1 hlasov
Autor se programování věnuje od střední školy, nyní studuje informatiku na VŠB-TUO a pracuje jako ETL developer pro společnost IDC. Mezi jeho oblíbené jazyky patří Python a SQL.
Aktivity