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
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. –