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

Hvornår/hvordan er standardværdiudtryksfunktioner bundet med hensyn til søgesti?

Standardværdier parses på oprettelsestidspunktet (tidlig binding!). Det du ser i psql, pgAdmin eller andre klienter er en tekstrepræsentation, men faktisk OID af funktionen now() på tidspunktet for oprettelse af kolonnen er standard gemt i systemkataloget pg_attrdef . Jeg citerer:

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 ændrer search_path , der får Postgres til at vise navnet på funktionen skema-kvalificeret, da det ikke længere ville blive løst korrekt med den aktuelle search_path .

Dump og gendannelse handler ikke om din tilpassede search_path indstilling. De sætter det eksplicit. Så det, du ser, er ikke relateret til dump-/gendannelsescyklussen.

Tilsidesæt indbyggede funktioner

Placering public før pg_catalog i search_path er et hazardspil . Underprivilegerede brugere (inklusive dig selv) får ofte lov til at skrive der og oprette funktioner, der utilsigtet kan tilsidesætte systemfunktioner - med vilkårligt (eller ondsindet) resultat.

Du vil have et dedikeret skema med begrænset adgang til at tilsidesætte indbyggede funktioner. Brug noget som dette i stedet:

SET search_path = override, pg_catalog, public;

Detaljer i denne relateret svar på dba.SE .



  1. MySQL:vælg det første element i en kommasepareret liste

  2. Php Oracle-forbindelse:oci_connect():ORA-24315:ulovlig attributtypefejl

  3. DeleteDatabase understøttes ikke af udbyderen, Oracle with Entity Framework

  4. Er en enkelt SQL Server-sætning atomart og konsistent?