====== HowTo k semestrálce ======
===== Transakce - vhodné čtení zvláště pro uživatele MySQL =====
První rada nad zlato: používejte příkaz **COMMIT**. Jelikož databáze používá něco, čemu se říká transakce (bude vám vysvětleno na posledních přednáškách), změny aplikované příkazy INSERT, UPDATE apod. nejsou automaticky uloženy, ale jsou k dispozici jen během aktuální relace (pokud se ve stejný čas připojíte jiným klientem, uvidíte původní stav). Změny je nutno "uložit" zavoláním příkazu ''COMMIT'', případně použít stejně pojmenované tlačítko v SqlDeveloperu. Naopak, pomocí příkazu ''ROLLBACK'' jste schopni odvolat ještě "necommitované" změny.
===== Smazaní všech dat z databáze =====
Protože původní obsah vašeho DB schématu může při ladění semestrálky překážet, nebo prostě chcete začít odznovu, hodí se způsob, jak to udělat rychleji než "po jednom".
Proveďte nad databází následující dotaz (SQLDeveloper - klávesa F5):
select 'drop table '|| table_name ||' cascade constraints;' as query from user_tables
union
select 'drop view '|| view_name ||' cascade constraints;' as query from user_views;
Výstupem skriptu bude další skript, a to skript pro smazání **všech vašich tabulek a pohledů** (tedy i těch z vaší semestrálky). Tento zkopírujte do správného okýnka a skript znovu spusťte (F5). Pro smazání ostatních objektů (které asi ale nepoužíváte) si můžete skript výše modifikovat.
===== Export dat =====
Pokud máte data v databázi a nechce se vám pracně psát INSERT skripty, můžete si pomoci exportem z SQLDeveloperu jedním z následujících dvou postupů
- Použít příkaz z menu **Tools -> Export DLL (and Data)** se zhruba takovýmto nastavením.\\ {{:dbs:semestralka_export.png?300|Kliknutím zvětšíte}}
- Použit příkaz **Export -> Insert** z kontextového menu (pravé tlačítko) nad každou tabulkou a výstupy tohoto příkazu sloučit do jediného skriptu.
**Pozor, v obou případech** je nutno skupiny INSERT příkazů přeuspořádat do takového pořadí, aby v době, kdy vkládáte nějakou hodnotu, která závisí na nějaké jiné hodnotě z jiné tabulky (cizí klíč), byla ta odkazovaná hodnota již v databázi (vizte příklad).
Dále je nutno na konec skriptu s INSERT příkazy vložit příkaz ''COMMIT;''
Také si dejte pozor na bug (viz níže).
**Příklad:**\\
OSOBA (__ID__, JMENO)\\
PES (__ID__, JMENO, ID_MAJITEL)\\
**IO:** PES[ID_MAJITEL] ⊆ OSOBA[ID]
Je nutno nejprve vložit všechny osoby, a poté psy. Při vkládání psa se totiž kontroluje, zda-li majitel existuje.
Jinou možností je použít tzv. deferred constraints, ale to by vyžadovalo vyšší skills, a mj. úpravy i skriptu pro vytváření tabulek a je to v 99,9% případů zbytečné (anebo byste tam měli hodně špatnou smyčku).
==== Vkládání datumů ====
Skript pro vkládání dat by měl jít spustit nezávisle na nastavených locales. Proto je nutné věnovat větší pozornost vkládání údajů typu datum a čas (protože každý národ píše datum jinak, takže se spoléhat na implicitní konverzi ze stringu se nevyplácí). Nejbezpečnější je použít zabudované funkce ''TO_DATE'', která přijme datum ve formátu, jakém si určíte.
==== Bug v SQLDeveloperu ====
Upozorňuji, že skripty pro vytvoření databáze a vložení dat musí být funkční (jinak půjdou body dolů). Pokud vám příkaz **Export Data -> INSERT** nad tabulkou v ER modeláři generuje místo čárky jako oddělovač hodnot tečku, pohrajte si s nastavením oddělovačů v nastavení SQLDeveloperu. Jedná se o bug. Hodnoty musí být navzájem různe, resp je nutné s tímto nastavením experimentovat, dokud se nezadaří.
{{:dbs:sqldev_fix.png?600|Snímek z funkční verze}}.
===== Různé =====
* Browsery se chovají různě k http odkazům z XML na DTD a XSLT soubory. Doporučuji si oba soubory, na které se ze začátku XML dokumentu odkazuje, zkopírovat do projektového adresáře a pak v XML souboru upravit cesty v záhlaví dokumentu na relativní.
* Někteří si stěžují, že dostanou při pokusu o připojení přes WebDAV návratový kód forbidden. Někde v tom ukázkovém XML je v návodu chyba. Je nutno vašemu klientu předhodit celou cestu k vašemu projektovému adresáři. Tj. ''http(s)://service.felk.cvut.cz/courses/Y36DBS/prj/vas_login/''.
* Při vytváření XML dokumentu semestrálky (hlavně zápis dotazů v RA a SQL) nezapomeňte, že znaky < a > mají v XML/HTML speciální význam. Je nutno je nahradit sekvencemi ''>'' a ''<''