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:
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á:
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:
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:
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 podmienkamiStiahnuté 322x (972 B)