5.7.3. Skeeman hakupolku

Kvalifioidut nimet ovat työläitä kirjoittaa, ja usein on joka tapauksessa parasta olla käyttämättä tiettyä skeemanimeä sovelluksissa. Siksi taulukoihin viitataan usein kvalifioimattomilla nimillä, jotka koostuvat vain taulukon nimestä. Järjestelmä määrittelee, mitä taulukkoa tarkoitetaan seuraamalla hakupolkua, joka on luettelo etsittävistä skeemoista.Hakupolun ensimmäinen vastaava taulukko katsotaan halutuksi. Jos hakupolussa ei ole vastaavuutta, ilmoitetaan virhe, vaikka tietokannan muissa skeemoissa olisikin vastaavia taulukkonimiä.

Kyky luoda samannimisiä objekteja eri skeemoissa vaikeuttaa sellaisen kyselyn kirjoittamista, joka viittaa täsmälleen samoihin objekteihin joka kerta. Se avaa myös käyttäjille mahdollisuuden muuttaa toisten käyttäjien kyselyjen käyttäytymistä, pahantahtoisesti tai vahingossa. Koska määrittelemättömät nimet ovat yleisiä kyselyissä ja niitä käytetään PostgreSQL:n sisäisissä sovelluksissa, skeeman lisääminen search_pat:iin johtaa siihen, että kaikki käyttäjät, joilla on CREATE-oikeudet kyseisessä skeemassa, voivat luottaa siihen. Kun suoritat tavallisen kyselyn, pahantahtoinen käyttäjä, joka pystyy luomaan objekteja hakupolun skeemaan, voi ottaa hallinnan ja suorittaa mielivaltaisia SQL-funktioita ikään kuin sinä suorittaisit ne.

Hakupolun ensimmäinen nimetty skeema on nimeltään currentschema. Sen lisäksi, että se on ensimmäinen haettu skeema, se on myös se skeema, johon uudet taulut luodaan, jos CREATE TABLE-komennossa ei määritetä skeemanimeä.

Näyttääksesi nykyisen hakupolun, käytä seuraavaa komentoa:

SHOW search_path;

Esimerkkiasetuksessa tämä palauttaa:

 search_path-------------- "$user",public

Ensimmäinen elementti määrittää, että haetaan skeemaa, jolla on sama nimi kuin nykyisellä käyttäjällä. Jos tällaista skeemaa ei ole olemassa, merkintä jätetään huomiotta. Toinen elementti viittaa julkiseen skeemaan, jonka olemme jo nähneet.

Hakupolun ensimmäinen olemassa oleva skeema on uusien objektien luomisen oletussijainti. Tämä on syy siihen, että oletusarvoisesti objektit luodaan julkiseen skeemaan. Kun objekteihin viitataan missä tahansa muussa yhteydessä ilman skeeman määrittelyä (taulumuutos, datan muutos tai kyselykomennot), hakupolkua kierretään, kunnes vastaava objekti löytyy. Siksi oletuskonfiguraatiossa kaikki kvalifioimattomat käyttöoikeudet voivat jälleen viitata vain julkiseen skeemaan.

Sijoittaaksemme uuden skeemamme hakupolkuun käytämme:

SET search_path TO myschema,public;

(Jätämme $userin tässä pois, koska meillä ei ole sille välitöntä tarvetta.) Ja sitten voimme käyttää taulukkoa ilmanschema-ominaisuutta:

DROP TABLE mytable;

Ja koska myschema on polun ensimmäinen elementti, uudet objektit luotaisiin oletusarvoisesti init.

Olisimme voineet myös kirjoittaa:

SET search_path TO myschema;

Tällöin meillä ei ole enää pääsyä julkiseen skeemaan ilmanexplicit-ominaisuutta. Julkisessa skeemassa ei ole mitään erikoista, paitsi että se on oletusarvoisesti olemassa. Sen voi myös poistaa.

Luvussa 9.25 kerrotaan myös muista tavoista manipuloida skeeman hakupolkua.

Hakupolku toimii samalla tavalla tietotyyppien, funktioiden ja operaattoreiden nimille kuin taulukon nimille. Tietotyyppi- ja funktioiden nimet voidaan määritellä täsmälleen samalla tavalla kuin taulukkonimet. Jos sinun täytyy kirjoittaa määritetty operaattorin nimi lausekkeeseen, on olemassa erityissäännös: sinun täytyy kirjoittaa

OPERATOR(schema.operator)

Tämä on tarpeen syntaktisen epäselvyyden välttämiseksi. Esimerkki on:

SELECT 3 OPERATOR(pg_catalog.+) 4;

Käytännössä yleensä turvaudutaan operaattoreiden hakupolkuun,jotta ei tarvitse kirjoittaa mitään niin rumaa kuin tuo.

Vastaa

Sähköpostiosoitettasi ei julkaista.