sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan påvirker søgestien identifikatoropløsning og det aktuelle skema

Hvad er skemasøgestien search_path ?

Manualen:

[...] tabeller omtales ofte med ukvalificerede navne, som kun består af tabelnavnet. Systemet bestemmer, hvilken tabel der menes ved at følge en søgesti, som er en liste over skemaer at se i .

Fed understregning min. Dette forklarer identifikatoropløsning .

"nuværende skema" (eller "standardskema") er, pr. dokumentation:

Det første skema navngivet i søgestien kaldes det aktuelle skema . Udover at være det første skema, der søges efter, er det også skemaet, hvori nye tabeller vil blive oprettet, hvis CREATE TABLE kommandoen angiver ikke et skemanavn.

Fed understregning min. Systemskemaerne pg_temp (skema for midlertidige objekter i den aktuelle session) og pg_catalog er automatisk en del af søgestien og søgte først , i denne rækkefølge. Manualen:

pg_catalog er altid effektivt en del af søgestien. Hvis det ikke er navngivet eksplicit i stien, søges det implicit før søgning i stiens skemaer. Dette sikrer, at indbyggede navne altid vil være tilgængelige. Du kan dog udtrykkeligt placere pg_catalog i slutningen af ​​din søgesti, hvis du foretrækker at få brugerdefinerede navne til at tilsidesætte indbyggede navne.

Fed fremhævelse i henhold til originalen. Og pg_temp kommer før det, medmindre det er sat i en anden position.

Hvordan indstilles det?

Der er forskellige måder at indstille runtime-variablen search_path .

  1. Indstil en klynge -wide standard for alle roller i alle databaser i postgresql.conf (og genindlæs). Forsigtig med det!

    search_path = 'blarg,public'
    

    Den leverede standard for denne indstilling er:

    search_path = "$user",public
    

    Det første element angiver, at der skal søges i et skema med samme navn som den nuværende bruger. Hvis der ikke findes et sådant skema, ignoreres posten.

  2. Indstil det som standard for én database :

    ALTER DATABASE test SET search_path = blarg,public;
    
  3. Indstil det som standard for rollen du forbinder med (effektiv i hele klyngen):

    ALTER ROLE foo SET search_path = blarg,public;
    
  4. Eller endda (ofte bedst!) som standard for en rolle i en database :

    ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
    
  5. Skriv kommandoen øverst i dit script. Eller kør det i din DB session :

    SET search_path = blarg,public;
    
  6. Indstil en specifik search_path for omfanget af en funktion (for at være sikker mod ondsindede brugere med tilstrækkelige privilegier). Læs om at skrive SECURITY DEFINER Funktioner sikkert 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øjere tal på min liste overtrumfer lavere tal.
Manualen har endnu flere måder , som at indstille miljøvariabler eller bruge kommandolinjeindstillinger.

For at se den aktuelle indstilling:

SHOW search_path;

For at nulstille det:

RESET search_path;

Manualen:

Standardværdien er defineret som den værdi, parameteren ville have haft, hvis ingen SET nogensinde var blevet udstedt for det i den nuværende session.



  1. Sådan fungerer logins på sammenkædede servere (T-SQL-eksempler)

  2. Find alle ikke-numeriske værdier i en kolonne i MariaDB

  3. Kan SQL Server sende en webanmodning?

  4. Eksekverer sæt SQL-forespørgsler ved hjælp af batch-fil?