2009-03-16 6 views
0

Ich habe eine Anwendung auf ASP.NET 3.5 und PostgreSQL 8.3 gebaut. Meine Datenbank hat 3 Benutzer, einen Datenbesitzer (xxx-Besitzer), einen Dateneditor (xxx-editor) und einen Datenviewer (xxx-viewer). Jeder Benutzer hat sein eigenes Schema namens xxx-schema, xxx-editor-schema und xxx-viewer-schema. Alle Daten werden im xxx-Schema gespeichert.Wo (oder wie) sollte ich das Schema in einer Select-Anweisung definieren, wenn ich PostgreSQL verwende?

Dies erfordert, dass ich das Schema angeben, wenn Sie eine Verbindung zur Datenbank als xxx-Editor oder xxx-Viewer-Benutzer herstellen, wie im folgenden Code-Schnipsel gezeigt.

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; 

Wenn ich diesem Weg folgen wäre, würde ich das Schema in der Web.config angeben. Es muss jedoch eine bessere Möglichkeit geben, anzugeben, welches Schema verwendet werden soll. Ich möchte in der Lage sein, die String-Verkettung nach Möglichkeit komplett zu entfernen.

Was ist der beste Weg, um das Schema in der SQL-Anweisung zu definieren?


EDIT

Die folgende von der PostgreSQL User Manual sieht vielversprechend aus.

SearchPath - Ändert den Suchpfad zu angegebenen und öffentlichen Schemas.

Von meinen begrenzten Tests funktioniert es in meiner Situation in Ordnung. Dies ist jedoch nur eine PostgreSQL-Lösung. Gibt es vielleicht eine Datenbank-agnostische Lösung, bieten die meisten Datenbanken solche Funktionalität?


EDIT 2

Ich habe die Antwort markiert, unter dem ich führen das Schema-Lookup, um auf Datenbankebene zu ändern. Mit der folgenden Änderung muss ich in meinen SQL-Anweisungen keinen Code hinzufügen.

ALTER USER xxx-viewer SET search_path TO '$user', xxx, public, sde 

Antwort

3

Sie können das Schema-Suchpfad auf einer Pro-Sitzung Basis festgelegt werden:

SET search_path TO myschema 

Wenn Sie zurück an das öffentliche Schema fallen wollen, könnten Sie verwenden:

SET search_path TO myschema, public 
+0

Danke, das funktioniert super! Außerdem habe ich den Suchpfad für jeden Benutzer über "ALTER USER xxx-viewer SET Suchpfad zu '$ user', xxx, public, sde" permanent geändert. "So brauche ich keinen zusätzlichen Code in meinen SQL-Anweisungen. –

0

Sie können auch:

SET SCHEMA 'myschema';

Diese Aussage ist das gleiche, die SET search_path TO myschema, public aber mehr