Přestože náš miniseriál o SQL skončil již takřka před rokem, dodnes od vás dostávám zajímavé otázky či žádosti o radu s řešením různorodých problémů.
Přestože náš miniseriál o SQL skončil již takřka před rokem, dodnes od vás dostávám zajímavé otázky či žádosti o radu s řešením různorodých problémů. Nejnovější dotaz zněl "Jak mohu pomocí SQL získat seznam tabulek?" Vzhledem k tomu, že se jedná o problém obecnějšího rázu, podívejme se na něj podrobněji.
Prakticky každý SŘBD uchovává informace o tabulkách v tzv. systémovém katalogu (někdy se na základě anglického originálu Data Dictionary můžete také setkat s pojmem datový slovník). Zpravidla je katalog realizován ve formě několika desítek interních tabulek, o jejichž obsah se stará sám systém – uživatel tedy ani nemusí vědět, že nějaký systémový katalog existuje. Tomu může být obsah systémového katalogu zpřístupněn několika způsoby, například jednoúčelovou utilitou umožňující klást jednoduché dotazy ve formátu QBE či správcovskou konzolou. Nejčastěji však uživatelé přistupují k jednotlivým tabulkám systémového katalogu (či k předpřipraveným pohledům vytvořeným nad těmito tabulkami) prostřednictvím příkazu SELECT. A odtud je již jen kousek k odpovědi na výše uvedený dotaz. Ale aby to nebylo zase tak jednoduché, mají v každém systému tabulky katalogu jinou podobu. Následující příklady ukazují, jak problém vyřešit v produktech Oracle 8.x, MS SQL 7.0 a Sybase Adaptive Server Anywhere 6.0 (ke kterým dotaz směřoval):
Oracle 8.x
Seznam všech tabulek, které jsou ve vlastnictví uživatele, lze získat z pohledu USER_TABLES (synonymum pro tento pohled je TABS):
SELECT table_name FROM user_tables
Seznam všech pohledů ve vlastnictví uživatele lze obdobně získat z pohledu USER_VIEWS:
SELECT view_name FROM user_views
MS SQL 7.0
Seznam objektů vytvořených v databázi je obsažen v tabulce SYSOBJECTS, přičemž atribut xtype {char(2)} určuje, o jaký typ objektu se jedná (U=uživatelská tabulka, S=systémová tabulka, V=pohled apod.), a atribut uid {smallint} určuje vlastníka objektu:
SELECT name,uid FROM sysobjects WHERE xtype=`U`
Sybase Adaptive Server Anywhere 6.0
Seznam tabulek vytvořených v databázi je v tomto prostředí možné získat dotazem na tabulku SYSTABLE, přičemž atribut table_type {char(10)} určuje, zda se jedná o tabulku (BASE) či pohled (VIEW), a atribut creator {smallint} určuje vlastníka objektu:
SELECT table_name,creator FROM systable WHERE table_type=`BASE`
Uvedená řešení není možné chápat jako jediná možná – cest je vždy více, především díky tomu, že požadované informace bývají obsaženy ve více různých pohledech/tabulkách systémového katalogu.
Uvědomte si také, že systémový katalog obsahuje podstatně více informací – od definice všech objektů v databázi přes přístupová práva až po uživatelské komentáře k objektům či protokoly o provedených akcích. Nespornou výhodou v SQL systémech je, že k jednotlivých pohledům/tabulkám katalogu můžete přistupovat právě pomocí standardních příkazů SQL (vlastně ne všech, málokdy totiž můžete měnit obsah systémového katalogu přímo pomocí příkazů UPDATE, INSERT či DELETE). Určitou nevýhodou je skutečnost, že katalog má v každém systému jinou podobu – musíte se tedy takřka vždy obrátit se žádostí o pomoc na dokumentaci k danému produktu. A nebo se zeptejte nás – nezapomínejte, že nabídka na řešení vašich problémů s SQL pořád platí.