5.7.3. Il percorso di ricerca degli schemi

I nomi qualificati sono noiosi da scrivere, e spesso è comunque meglio non trainare un particolare nome di schema nelle applicazioni. Pertanto le tabelle sono spesso indicate con nomi non qualificati, che consistono solo nel nome della tabella. Il sistema determina quale tabella si intende seguendo un percorso di ricerca, che è una lista di schemi in cui cercare; la prima tabella corrispondente nel percorso di ricerca è considerata quella desiderata. Se non c’è corrispondenza nel percorso di ricerca, viene riportato un errore, anche se i nomi delle tabelle corrispondenti esistono in altri schemi nel database.

La capacità di creare oggetti con nomi simili in schemi diversi complica la scrittura di una query che fa riferimento esattamente agli stessi oggetti ogni volta. Apre anche il potenziale per gli utenti di cambiare il comportamento delle query di altri utenti, maliziosamente o accidentalmente. A causa della prevalenza di nomi non qualificati nelle query e del loro uso negli interni di PostgreSQL, l’aggiunta di uno schema a search_patheffectively trusts all users having CREATEprivilege on that schema. Quando si esegue una normale query, un utente malintenzionato in grado di creare oggetti in uno schema del vostro percorso di ricerca può prendere il controllo ed eseguire funzioni SQL arbitrarie come se le aveste eseguite voi.

Il primo schema nominato nel percorso di ricerca è chiamato currentschema. Oltre ad essere il primo schema cercato, è anche lo schema in cui saranno create le nuove tabelle se il comando CREATE TABLE non specifica il nome dello schema.

Per mostrare il percorso di ricerca corrente, usare il seguente comando:

SHOW search_path;

Nella configurazione predefinita questo restituisce:

 search_path-------------- "$user",public

Il primo elemento specifica che uno schema con lo stesso nome dell’utente corrente deve essere cercato. Se tale schema non esiste, la voce viene ignorata. Il secondo elemento si riferisce allo schema pubblico che abbiamo già visto.

Il primo schema nel percorso di ricerca che esiste è la posizione predefinita per la creazione di nuovi oggetti. Questa è la ragione per cui per default gli oggetti sono creati nello schema pubblico. Quando gli oggetti sono referenziati in qualsiasi altro contesto senza qualificazione dello schema (modifica della tabella, modifica dei dati, o comandi di query) il percorso di ricerca viene attraversato fino a trovare un oggetto corrispondente. Perciò, nella configurazione predefinita, qualsiasi accesso non qualificato può riferirsi solo allo schema pubblico.

Per mettere il nostro nuovo schema nel percorso, usiamo:

SET search_path TO myschema,public;

(Omettiamo $user qui perché non ne abbiamo bisogno immediato.) E poi possiamo accedere alla tabella senza la qualifica di schema:

DROP TABLE mytable;

Inoltre, dato che myschema è il primo elemento nel percorso, i nuovi oggetti verrebbero creati per default init.

Potremmo anche scrivere:

SET search_path TO myschema;

Allora non abbiamo più accesso allo schema pubblico senza la qualifica esplicita. Non c’è niente di speciale riguardo allo schema pubblico, eccetto che esiste per default. Può anche essere eliminato.

Vedete anche la Sezione 9.25 per altri modi di manipolare il percorso di ricerca dello schema.

Il percorso di ricerca funziona allo stesso modo per i nomi di tipi di dati, nomi di funzioni e nomi di operatori come per i nomi di tabella. I nomi dei tipi di dati e delle funzioni possono essere qualificati esattamente allo stesso modo dei nomi delle tabelle. Se avete bisogno di scrivere un nome di operatore qualificato in un’espressione, c’è una disposizione speciale: dovete scrivere

OPERATOR(schema.operator)

Questo è necessario per evitare ambiguità sintattiche. Un esempio è:

SELECT 3 OPERATOR(pg_catalog.+) 4;

In pratica ci si affida di solito al percorso di ricerca degli operatori, per non dover scrivere qualcosa di così brutto come questo.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.