5.7.3. The Schema Search Path

Kvalificerade namn är tråkiga att skriva, och det är ofta bäst att inte dra in ett visst schemanamn i program ändå. Därför hänvisas ofta till tabeller med okvalificerade namn, som bara består av tabellens namn. Systemet bestämmer vilken tabell som avses genom att följa en sökväg, som är en lista över scheman att leta i. Den första matchande tabellen i sökvägen anses vara den önskade. Om det inte finns någon matchning i sökvägen rapporteras ett fel, även om matchande tabellnamn finns i andra scheman i databasen.

Möjligheten att skapa objekt med samma namn i olika scheman gör det svårare att skriva en fråga som hänvisar till exakt samma objekt varje gång. Det ger också användarna möjlighet att ändra beteendet hos andra användares frågor, antingen av illvilja eller av misstag. På grund av förekomsten av okvalificerade namn i frågor och deras användning i PostgreSQL:s interna system, så innebär det att lägga till ett schema till search_patheffektivt att alla användare som har CREATEprivilege på det schemat kan lita på det. När du kör en vanlig fråga kan en illasinnad användare som kan skapa objekt i ett schema i din sökväg ta kontroll och utföra godtyckliga SQL-funktioner som om det var du som utförde dem.

Det första schemat som namnges i sökvägen kallas det aktuella schemat. Förutom att det är det första schemat som söks är det också det schema där nya tabeller kommer att skapas om kommandot CREATE TABLE inte anger något schemanamn.

För att visa den aktuella sökvägen använder du följande kommando:

SHOW search_path;

I standardkonfigurationen returneras:

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

Det första elementet specificerar att ett schema med samma namn som den aktuella användaren ska sökas. Om inget sådant schema finns ignoreras posten. Det andra elementet hänvisar till det offentliga schema som vi redan har sett.

Det första schemat i sökvägen som finns är standardplatsen för att skapa nya objekt. Det är anledningen till att objekt som standard skapas i det offentliga schemat. När objekt refereras i något annat sammanhang utan schemakvalificering (tabellmodifiering, datamodifiering eller frågekommandon) genomkorsas sökvägen tills ett matchande objekt hittas. I standardkonfigurationen kan därför alla okvalificerade åtkomster återigen endast hänvisa till det offentliga schemat.

För att placera vårt nya schema i sökvägen använder vi:

SET search_path TO myschema,public;

(Vi utelämnar $user här eftersom vi inte har något omedelbart behov av det.) Och sedan kan vi få tillgång till tabellen utan schema-kvalifikation:

DROP TABLE mytable;

Och eftersom myschema är det första elementet i sökvägen skulle nya objekt som standard skapas init.

Vi kunde också ha skrivit:

SET search_path TO myschema;

Då har vi inte längre tillgång till det offentliga schemat med oexplicit kvalifikation. Det finns inget speciellt med det offentliga schemat förutom att det finns som standard. Det kan också tas bort.

Se även avsnitt 9.25 för andra sätt att manipulera schemasökvägen.

Sökvägen fungerar på samma sätt för datatypnamn, funktionsnamn och operatörsnamn som den gör för tabellnamn. Datatyp- och funktionsnamn kan kvalificeras på exakt samma sätt som tabellnamn. Om du behöver skriva ett kvalificerat operatörsnamn i ett uttryck finns det en särskild bestämmelse: du måste skriva

OPERATOR(schema.operator)

Detta behövs för att undvika syntaktisk tvetydighet. Ett exempel är:

SELECT 3 OPERATOR(pg_catalog.+) 4;

I praktiken förlitar man sig oftast på sökvägen för operatörer,för att inte behöva skriva något så fult som detta.

Lämna ett svar

Din e-postadress kommer inte publiceras.