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
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top