3. diel - MS-SQL krok za krokom: Vkladanie a mazanie dát v tabuľke
V minulej lekcii, MS-SQL krok za krokom: Vytvorenie databázy a tabuľky , sme si vytvorili databázu a v nej tabuľku užívateľov.
Dnes budeme v MS-SQL tutoriálu vkladať a mazať záznamy, teda používateľa.
Vloženie zápisu do tabuľky
Vloženie nového užívateľa si ukážeme opäť najprv cez Visual Studio.
Pravým tlačidlom kliknite na tabuľku Uzivatele
a vyberte Show
Table Data.
Do prázdneho riadku s hodnotami NULL
doplňte hodnoty ako
potrebujete. Vďaka Identity nemusíme hodnotu stĺpca Id
nastavovať, nastaví sa sama.
Výkričníky nám hovoria, že hodnota bola zmenená, ale zmeny neboli do databázy odoslané. Potvrďte riadok klávesom Enter alebo kliknite na ďalší riadok, dáta sa do databázy odošlú a teda výkričníky zmizne.
Na pozadí všetkého je opäť SQL dotaz. Vložiť Jana Nováka by sme mohli rovnako aj týmto dotazom:
INSERT INTO [Uzivatele] ( [Jmeno], [Prijmeni], [DatumNarozeni], [PocetClanku]) VALUES ( 'Jan', 'Novák', '1984-11-03', 17 );
Prvý riadok je opäť jasný, jednoducho hovoríme "Vlož do
používateľov", ďalšie riadky sú stĺpce, v ktorých bude mať nová
položka nejaké hodnoty. Stĺpec s Id
tu neuvádzame. Nasleduje
kľúčové slovo VALUES
a ďalšie výpočet prvkov v
zátvorkách, tentoraz hodnôt. Tie 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.
POZOR! 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.
Vložte si pomocou SQL dotazu niekoľko užívateľov, ak nemáte fantáziu, pokojne vložte tých z tabuľky na začiatku:
Vymazanie záznamu
Skúsme si niekoho vymazať. Asi by ste prišli na to, že sa to robí klávesom Delete po označení celého riadku kliknutím na šedý stĺpec vľavo. Skúste si to.
Vymazanie sa v jazyku SQL robí pomocou príkazu DELETE:
DELETE FROM [Uzivatele] WHERE [Id] = 2;
Skúste si to, Visual Studio je na DELETE
opatrné a bude sa
vás pýtať.
Príkaz je jednoduchý, voláme "vymaž z užívateľov", kde sa hodnota v
stĺpci Id
rovná 2
. 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] = 'Jan' AND [DatumNarozeni] > '1980-1-1') OR ([PocetClanku] < 3);
Príkaz vyššie vymaže všetky Jany, ktorí boli narodení od roku 1980 alebo všetkých užívateľov, ktorí napísali menej ako 3 články.
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.
Rozhodol som sa túto pasáž vložiť hneď na začiatok kurzu. Ak vás nejako zmätie, tak si z toho nič nerobte, hlavné je o riziku vedieť, rovnako si bezpečnú prácu s databázou ukážeme až budeme s databázou pracovať z C# .NET.
Čo je SQL injecton
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 textu dotazu vložíme teda nejakú premennú, ktorá pochádza od užívateľa:
"DELETE FROM [Uzivatele] WHERE [Prijmeni] = '" + prijmeni + "'";
prijmeni
je premenná, obsahujúci 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
prijmeni
zadá toto:
' OR 1 = 1 --
Výsledný dotaz bude vyzerať takto:
DELETE FROM [Uzivatele] WHERE [Prijmeni] = '' OR 1 = 1 --';
Pretože 1 = 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, presnejšie namiesto jednej úvodzovky napíšeme 2 za sebou. 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.
Odescapovaný dotaz by vyzeral takto:
DELETE FROM [Uzivatele] WHERE [Prijmeni] = ''' OR 1 = 1 --';
Úvodzovky od užívateľa je zdvojená. Takýto dotaz je neškodný, pretože časť vložená užívateľom je považovaná ako text. V texte sa nevyhodnotí úvodzovky, ktorú útočník na začiatok priezvisko zapísal. Ď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 (najčastejšie zavináč a názov premennej):
DELETE FROM [Uzivatele] WHERE [Prijmeni] = @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. Toto si budeme ukazovať v ďalších sekciách o databázach v C# .NET.
Editácia záznamov
Databáza umožňuje 4 základné operácie, ktoré sú často označované skratkou CRUD:
- C reate - vytvorenie záznamu
- R ead - načítanie (vyhľadanie)
- U pdate - editácia
- D élet - 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 lekciu, editáciu si vysvetlíme ešte dnes.
Na editáciu vo Visual Studiu by ste určite prišli, stačí prepísať dáta v tabuľke a potvrdiť. K úprave slúži SQL dotaz UPDATE, úprava nejakého užívateľa by vyzerala asi takto:
UPDATE [Uzivatele] SET [Prijmeni] = 'Dolejší', [PocetClanku] = [PocetClanku] + 1 WHERE [Id] = 1;
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. Ako u DELETE
platí, že nesmiete zabudnú na
klauzulu WHERE
, inak dôjde k zmene všetkých záznamov v
databáze!
V budúcej lekcii, MS-SQL krok za krokom: Výber dát (vyhľadávanie) , pôjdeme na sľúbené vyhľadávanie.