5.7.3. Cesta k vyhledávání schémat
Kvalifikované názvy je zdlouhavé psát a často je stejně lepší nevkládat do aplikací konkrétní název schématu. Proto se na tabulky často odkazuje pomocí nekvalifikovaných názvů, které se skládají pouze z názvu tabulky. Systémurčí, která tabulka je myšlena, podle vyhledávací cesty, což je seznam schémat, ve kterých se má hledat. první odpovídající tabulka ve vyhledávací cestě je považována za hledanou. Pokud ve vyhledávací cestě není žádná shoda, je hlášena chyba, i když v jiných schématech databáze existují odpovídající názvy tabulek.
Možnost vytvářet podobně pojmenované objekty v různých schématechkomplikuje psaní dotazu, který pokaždé odkazuje na přesně stejné objekty. Otevírá také možnost, aby uživatelé zlomyslně nebo náhodně měnili chování dotazů jiných uživatelů. Vzhledem k rozšířenosti nekvalifikovaných názvů v dotazech a jejich používání v PostgreSQLinternals přidání schématu do search_patheffective trusts all users having CREATEprivilege on that schema. Při spuštění běžného dotazu může zlomyslný uživatel schopný vytvářet objekty ve schématu vyhledávací cesty převzít kontrolu a provádět libovolné funkce SQL, jako byste je provedli vy.
První schéma pojmenované ve vyhledávací cestě se nazývá aktuálníschéma. Kromě toho, že je to první prohledávané schéma, je to také schéma, ve kterém budou vytvořeny nové tabulky, pokud příkaz CREATE TABLE nezadá název schématu.
Chcete-li zobrazit aktuální vyhledávací cestu, použijte následující příkaz:
SHOW search_path;
Ve výchozím nastavení to vrátí:
search_path-------------- "$user",public
První prvek určuje, že má být prohledáno schéma se stejným názvem jako aktuální uživatel. Pokud takové schéma neexistuje, je tento údaj ignorován. Druhý prvek odkazuje na veřejné schéma, které jsme již viděli.
První schéma ve vyhledávací cestě, které existuje, je výchozím místem pro vytváření nových objektů. To je důvod, proč se výchozí objekty vytvářejí ve veřejném schématu. Při odkazování na objekty v jakémkoli jiném kontextu bez kvalifikace schématu (modifikace tabulky, modifikace dat nebo dotazovací příkazy) je vyhledávací cesta procházena, dokud není nalezen odpovídající objekt. Proto ve výchozí konfiguraci může jakýkoli nekvalifikovaný přístup opět odkazovat pouze na veřejné schéma.
Pro vložení našeho nového schématu do cesty použijeme:
SET search_path TO myschema,public;
(Vynecháváme zde $user, protože jej bezprostředně nepotřebujeme.) A pak můžeme přistupovat k tabulce bez kvalifikace schématu:
DROP TABLE mytable;
Jelikož je myschema prvnímprvkem v cestě, nové objekty by se standardně vytvářely init.
Mohli jsme také napsat:
SET search_path TO myschema;
Pak už nemáme přístup k veřejnému schématu bez explicitní kvalifikace. Na veřejném schématu není nic zvláštního kromě toho, že existuje ve výchozím nastavení. Lze jej také zrušit.
Podívejte se také do kapitoly 9.25 na další způsoby manipulace s vyhledávací cestou schématu.
Vyhledávací cesta funguje stejným způsobem pro názvy datových typů,názvy funkcí a názvy operátorů jako pro názvy tabulek. Názvy datových typů a funkcí lze kvalifikovat přesně stejným způsobem jako názvy tabulek. Pokud potřebujete zapsat kvalifikovaný název operátoru ve výrazu, existuje zvláštní ustanovení: musíte napsat
OPERATOR(schema.operator)
To je nutné, aby se zabránilo syntaktické nejednoznačnosti. Příkladem je:
SELECT 3 OPERATOR(pg_catalog.+) 4;
V praxi se obvykle spoléhá na vyhledávací cestu pro operátory,aby se nemuselo psát nic tak ošklivého.
.