Dove (o come) dovrei definire lo schema in un'istruzione select quando uso PostgreSQL?
-
19-08-2019 - |
Domanda
Ho un'applicazione basata su ASP.NET 3.5 e PostgreSQL 8.3. Il mio database ha 3 utenti, un proprietario di dati (proprietario di xxx), un editor di dati (editor di xxx) e un visualizzatore di dati (visualizzatore di xxx). Ogni utente ha il proprio schema chiamato xxx-schema, xxx-editor-schema e xxx-viewer-schema. Tutti i dati sono memorizzati in xxx-schema.
Questo richiede che specifichi lo schema quando mi connetto al database come utente dell'editor xxx o del visualizzatore xxx come mostrato nel frammento seguente.
NpgsqlCommand pgCommand = new NpgsqlCommand();
pgCommand.CommandText = @"SELECT
bldg_id,
bldg_name,
bldg_no,
FROM " + this.schema + @".buildings
WHERE UPPER(bldg_id) LIKE UPPER(@id);";
pgCommand.Parameters.Add("@id", "%" + id + "%");
pgCommand.Connection = pgConnection;
Se dovessi seguire questa strada, specificherei lo schema in Web.config. Tuttavia, ci deve essere un modo migliore per specificare quale schema deve essere usato. Vorrei poter rimuovere completamente la concatenazione di stringhe, se possibile.
Qual è il modo migliore per definire lo schema da utilizzare nell'istruzione SQL?
Modifica
Quanto segue dal Manuale utente PostgreSQL sembra promettente.
SearchPath: modifica il percorso di ricerca in schemi specificati e pubblici.
Dal mio test limitato funziona bene nella mia situazione. Tuttavia, questa è una soluzione unica per PostgreSQL. Esiste forse una soluzione agnostica per più database, la maggior parte dei database ha fornito tale funzionalità?
EDIT 2
Ho contrassegnato la risposta di seguito che mi ha portato a cambiare l'ordine di ricerca dello schema a livello di database. Con la seguente modifica non ho bisogno di aggiungere codice nelle mie istruzioni SQL.
ALTER USER xxx-viewer SET search_path TO '$user', xxx, public, sde
Soluzione
È possibile impostare il percorso di ricerca dello schema in base alla sessione utilizzando:
SET search_path TO myschema
Se vuoi tornare allo schema pubblico, puoi usare:
SET search_path TO myschema, public
Altri suggerimenti
Puoi anche fare:
IMPOSTA SCHEMA 'myschema';
Questa affermazione è la stessa che SET search_path TO myschema, public
ma altro