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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.