sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur påverkar sökvägen identifierarens upplösning och det aktuella schemat

Vad är sökvägen för schemat search_path ?

Manualen:

[...] tabeller hänvisas ofta till med okvalificerade namn, som bara består av tabellnamnet. Systemet avgör vilken tabell som avses genom att följa en sökväg, som är en lista över scheman att titta i .

Djärv betoning min. Detta förklarar identifieringsupplösning .

Det ”nuvarande schemat” (eller "standardschema") är, enligt dokumentation:

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

Djärv betoning min. Systemscheman pg_temp (schema för tillfälliga objekt för den aktuella sessionen) och pg_catalog är automatiskt en del av sökvägen och sökte först , i denna ordning. Manualen:

pg_catalog är alltid effektivt en del av sökvägen. Om det inte nämns explicit i sökvägen söks det underförstått före söka efter vägens scheman. Detta säkerställer att inbyggda namn alltid kommer att vara tillgängliga. Du kan dock uttryckligen placera pg_catalog i slutet av din sökväg om du föredrar att användardefinierade namn ska åsidosätta inbyggda namn.

Fet betoning enligt originalet. Och pg_temp kommer före det, om det inte sätts i en annan position.

Hur ställer jag in det?

Det finns olika sätt att ställa in körtidsvariabeln search_path .

  1. Ställ in ett kluster -wide default för alla roller i alla databaser i postgresql.conf (och ladda om). Var försiktig med det!

    search_path = 'blarg,public'
    

    Standardinställningen för den här inställningen är:

    search_path = "$user",public
    

    Det första elementet anger att ett schema med samma namn som den nuvarande användaren ska sökas igenom. Om inget sådant schema finns, ignoreras posten.

  2. Ställ in det som standard för en databas :

    ALTER DATABASE test SET search_path = blarg,public;
    
  3. Ställ in det som standard för rollen du ansluter till (effektivt i hela kluster):

    ALTER ROLE foo SET search_path = blarg,public;
    
  4. Eller till och med (ofta bäst!) som standard för en roll i en databas :

    ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
    
  5. Skriv kommandot överst i ditt skript. Eller kör det i din DB session :

    SET search_path = blarg,public;
    
  6. Ange en specifik search_path för omfattningen av en funktion (för att vara säker från illvilliga användare med tillräckliga privilegier). Läs om hur du skriver SECURITY DEFINER Funktioner säkert i manualen.

CREATE FUNCTION foo() RETURNS void AS
$func$
BEGIN
   -- do stuff
END
$func$ LANGUAGE plpgsql SECURITY DEFINER
       SET search_path=blarg,public,pg_temp;

Högre nummer i min lista överträffar lägre nummer.
Manualen har ännu fler sätt , som att ställa in miljövariabler eller använda kommandoradsalternativ.

För att se den aktuella inställningen:

SHOW search_path;

Så här återställer du den:

RESET search_path;

Manualen:

Standardvärdet definieras som det värde som parametern skulle ha haft, om ingen SET saknas någonsin har utfärdats för det under den aktuella sessionen.



  1. PRAGMA table_list i SQLite

  2. Vad är LEN()-ekvivalenten i MySQL?

  3. MariaDB LCASE() Förklarad

  4. Vad betyder det att undkomma ett snöre?