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

Quando/come vengono vincolate le funzioni di espressione del valore predefinito rispetto a percorso_ricerca?

I valori predefiniti vengono analizzati al momento della creazione (associazione anticipata!). Quello che vedi in psql, pgAdmin o altri client è una rappresentazione testuale ma, in effetti, l'OID della funzione now() al momento della creazione la colonna default è memorizzata nel catalogo di sistema pg_attrdef . Cito:

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

Quando modifichi lo search_path , ciò fa sì che Postgres visualizzi il nome della funzione qualificata allo schema, poiché non verrebbe più risolta correttamente con l'attuale search_path .

Il dump e il ripristino non riguardano il tuo search_path personalizzato ambientazione. Lo hanno impostato in modo esplicito. Quindi quello che vedi non è correlato al ciclo di dump/ripristino.

Sostituisci le funzioni integrate

Inserimento di public prima di pg_catalog nel search_path è un gioco d'azzardo . Gli utenti svantaggiati (incluso te stesso) sono spesso autorizzati a scrivere lì e creare funzioni che potrebbero inavvertitamente prevalere sulle funzioni di sistema, con risultati arbitrari (o dannosi).

Vuoi uno schema dedicato con accesso limitato per ignorare le funzioni integrate. Usa invece qualcosa del genere:

SET search_path = override, pg_catalog, public;

Dettagli in questo risposta correlata su dba.SE .