{{predmet|Databáze typu klient-server|Tomáš Rubač|DBI004}}
= Info =
Celkem poutavá přednáška o SQL z praktického hlediska.
== Zápočet ==
* triviální SQL program na dvou tabulkách (nemusí být velký, stačí kousek kódu).
* vše ošetřené v databázi: integrita, triggery, procedury k sahání (i s ošetřením výjimek).
* 50-60 řádek.
== Zkouška ==
* jednoduchá písemka (zadání podobné zápočťáku).
* přepsat datový model do SQL i s nějakými triggery/procedurami.
* nějaké ústní otázky.
* není potřeba zápočet.
=== Termíny v LS 2004/2005 ===
* 25.05.2005 S3 17:30
* 09.06.2005 S3 17:30
* 23.06.2005 S3 17:30
= Poznámky =
== DDL - Date definition language ==
== DML - Data manipulating language ==
== Zámky ==
== Kurzory ==
== Procedůry funkce ==
== Triggery ==
Procedura automaticky spuštěná na základě nějaké události (login a logout uživatele, insert, update a delete nad tabulkou, při systémové chybě).
'''create [or replace] trigger [někdy_jde_pojmenovat] on <jméno_tabulky> [before/after/instead of] [insert/update/delete]'''
* jeden trigger na tabulku teoreticky stačí, ale když se k tomu dostane víc lidí, tak se mezi sebou pobijí. Když je triggerů na jednu věc víc, jejich pořadí je nedefinované.
* užitečné k ošetřování stavových sloupců a podobných záležitostí (pak je špatné, když trigger nedopatřením odpadne).
* triggery výrazně zpomalují výpočty, dají se dočasně sundat pomocí disable trigger (když má uživatel právo alter trigger).
* dají se spouštět buď po každém řádku (FOR EACH ROW) nebo jednou za všechny řádky (FOR EACH STATEMENT).
* v insert triggeru vidím nové hodnoty, v delete staré, v update nové i staré. Speciální tabulky new a old (chovají se jako normální tabulky, new se dá upravovat před vložením) (v Oraclu je místo virtuální tabulky defaultně jakýsi record :new, dá se to definovat pomocí klauzule referencing).
* instead of triggery dobré k simulaci vkládání do pohledů, do kterých to normálně nemusí jít.
* update triggery se spouští řádek po řádku.
* v triggeru se nesmí sahat na tabulky, které už triggery ošetřují (takže se nedá udělat cyklické věčné zaplnění).
* v update triggerech se dá používat příkaz if updated (...), který ověřuje, jestli dané sloupce byly změněny.
* triggery mohou pomocí raise error (sp?) házet tajemné a těžko dohledatelné chyby.
* trigger může na některých serverech pomocí příkazu rollback transaction sundat celou operaci, která trigger vyvolala (ne celou transakci jako normální rollback).
* Dají se použít pro udržení konzistence databáze (kromě věcí, na které jsou constrainty). Když vím, že data jsou konzistentní, nemusím se pak zdržovat dodatečnými testy integrity.
* nedají se linkovat z jiných balíků, ale mohou je volat (dobré pro verzování, které s triggery moc nejde) až na příkazy jako rollback transaction výše, které mohou být pouze v triggerech.
== Paralerní/distribuované zpracování ==
== Provázaní s aplikací ==
= Odkazy =
* [http://urtax.ms.mff.cuni.cz/~novap2am/poznamky/databaze2.sxw Poznámky z přednášky]