5.7.3. A sémakeresési útvonal
A minősített nevek megírása fárasztó, és gyakran amúgy is az a legjobb, ha egy adott sémanevet nem vezetünk be az alkalmazásokba. Ezért a táblákra gyakran hivatkoznak minősítetlen nevekkel, amelyek csak a tábla nevéből állnak. A rendszer egy keresési útvonal követésével határozza meg, hogy melyik táblára gondolunk, amely a keresendő sémák listája.A keresési útvonal első megfelelő tábláját tekintjük a keresett táblának. Ha nincs találat a keresési útvonalban, hibaüzenet jelenik meg, még akkor is, ha az adatbázisban más sémákban léteznek megfelelő táblázatok nevei.
A különböző sémákban lévő hasonló nevű objektumok létrehozásának képessége megnehezíti olyan lekérdezés írását, amely minden alkalommal pontosan ugyanazokra az objektumokra hivatkozik. Lehetőséget teremt arra is, hogy a felhasználók rosszindulatúan vagy véletlenül megváltoztassák más felhasználók lekérdezéseinek viselkedését. A minősítetlen nevek elterjedtsége miatt a lekérdezésekben és a PostgreSQL belső rendszereiben való használatuk miatt, egy séma hozzáadása a search_pat-hoz ténylegesen megbízik minden olyan felhasználóban, akinek CREATE privilégiuma van az adott sémán. Amikor egy közönséges lekérdezést futtat, egy rosszindulatú felhasználó, aki képes objektumokat létrehozni a keresési útvonal sémájában, átveheti az irányítást, és tetszőleges SQL függvényeket hajthat végre, mintha Ön hajtotta volna végre.
A keresési útvonalban elsőként megnevezett sémát nevezzük aktuális sémának. Amellett, hogy ez az első keresett séma, ez az a séma is, amelyben az új táblák létrehozásra kerülnek, ha a CREATE TABLE parancs nem ad meg sémát.
Az aktuális keresési útvonal megjelenítéséhez használja a következő parancsot:
SHOW search_path;
Az alapértelmezett beállításban ez adja vissza:
search_path-------------- "$user",public
Az első elem azt adja meg, hogy az aktuális felhasználóval azonos nevű sémát kell keresni. Ha ilyen séma nem létezik, a bejegyzést figyelmen kívül hagyja. A második elem a már látott nyilvános sémára utal.
A keresési útvonal első létező sémája az új objektumok létrehozásának alapértelmezett helye. Ez az oka annak, hogy alapértelmezés szerint az objektumok a nyilvános sémában jönnek létre. Amikor az objektumokra bármilyen más kontextusban hivatkoznak sémaminősítés nélkül (táblamódosítás, adatmódosítás vagy lekérdezési parancsok), a keresési útvonalat addig járják be, amíg nem találnak megfelelő objektumot. Ezért az alapértelmezett konfigurációban minden minősítetlen hozzáférés ismét csak a nyilvános sémára hivatkozhat.
Az új sémánkat az útvonalba helyezve a következőt használjuk:
SET search_path TO myschema,public;
(A $user-t itt elhagyjuk, mert nincs rá közvetlen szükségünk.) És ezután hozzáférhetünk a táblához séma minősítés nélkül:
DROP TABLE mytable;
Amellett, mivel a myschema az első elem az elérési útvonalban, az új objektumok alapértelmezés szerint init-ben jönnének létre.
Azt is írhattuk volna:
SET search_path TO myschema;
Ezután már nem férünk hozzá a nyilvános sémához kifejezett minősítés nélkül. A publikus sémában nincs semmi különleges azon kívül, hogy alapértelmezés szerint létezik. Ez is elhagyható.
A sémakeresési útvonal manipulálásának egyéb módjairól lásd még a 9.25. szakaszt.
A keresési útvonal ugyanúgy működik az adattípusnevek, függvénynevek és operátorok nevei esetében, mint a táblázatok nevei esetében. Az adattípus- és függvénynevek pontosan ugyanúgy minősíthetők, mint a táblázatok nevei. Ha minősített operátornevet kell írni egykifejezésben, van egy speciális rendelkezés:
OPERATOR(schema.operator)
Ez a szintaktikai kétértelműség elkerülése miatt szükséges. Egy példa:
SELECT 3 OPERATOR(pg_catalog.+) 4;
A gyakorlatban az ember általában az operátorok keresési útvonalára támaszkodik,hogy ne kelljen ilyen csúnya dolgot írni.