PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wann / wie werden Standardwert-Ausdrucksfunktionen in Bezug auf Suchpfad gebunden?

Standardwerte werden zum Zeitpunkt der Erstellung geparst (frühes Binden!). Was Sie in psql, pgAdmin oder anderen Clients sehen, ist eine Textdarstellung, aber tatsächlich die OID der Funktion now() zum Zeitpunkt der Erstellung wird die Spalte default im Systemkatalog gespeichert pg_attrdef . Ich zitiere:

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

Wenn Sie den search_path , was dazu führt, dass Postgres den Namen der Funktion schemaqualifiziert anzeigt, da er mit dem aktuellen search_path nicht mehr korrekt aufgelöst würde .

Dump und Restore haben nichts mit Ihrem benutzerdefinierten search_path zu tun Einstellung. Sie setzen es explizit. Was Sie also sehen, hat nichts mit dem Dump/Restore-Zyklus zu tun.

Integrierte Funktionen überschreiben

Platzieren von public vor pg_catalog im search_path ist ein Gefahrenspiel . Unterprivilegierten Benutzern (einschließlich Ihnen selbst) ist es oft erlaubt, dort zu schreiben und Funktionen zu erstellen, die versehentlich Systemfunktionen außer Kraft setzen können - mit willkürlichem (oder böswilligem) Ergebnis.

Sie möchten ein dediziertes Schema mit eingeschränktem Zugriff integrierte Funktionen zu überschreiben. Verwenden Sie stattdessen so etwas:

SET search_path = override, pg_catalog, public;

Details in diesem verwandte Antwort auf dba.SE .