sql >> Databasteknik >  >> RDS >> PostgreSQL

När/hur är standardvärdeuttrycksfunktioner bundna med avseende på sökväg?

Standardvärden analyseras vid skapandet (tidig bindning!). Det du ser i psql, pgAdmin eller andra klienter är en textrepresentation men i själva verket OID av funktionen now() vid tidpunkten för att skapa kolumnen lagras standard i systemkatalogen pg_attrdef . Jag citerar:

adbin   pg_node_tree  The internal representation of the column default value
adsrc   text          A human-readable representation of the default value

När du ändrar search_path , som gör att Postgres visar namnet på funktionen schemakvalificerad, eftersom det inte skulle lösas korrekt längre med den nuvarande search_path .

Dumpning och återställning handlar inte om din anpassade search_path miljö. De anger det uttryckligen. Så det du ser är inte relaterat till dumpnings-/återställningscykeln.

Åsidosätt inbyggda funktioner

Placera public före pg_catalog i search_path är ett hazardspel . Underprivilegierade användare (inklusive du själv) tillåts ofta skriva där och skapa funktioner som oavsiktligt kan åsidosätta systemfunktioner - med godtyckliga (eller skadliga) resultat.

Du vill ha ett dedikerat schema med begränsad åtkomst för att åsidosätta inbyggda funktioner. Använd något sånt här istället:

SET search_path = override, pg_catalog, public;

Detaljer i denna relaterat svar på dba.SE .



  1. Få kolumnnamn istället för kolumnvärde

  2. första raden VS Nästa rad VS rownum

  3. Hur man konverterar tidsstämpel med millisekunder till datum i Oracle

  4. JDBC:Hur hämtar man resultatet av SQL COUNT-funktionen från resultatuppsättningen?