Wo (oder wie) soll ich das Schema in einer select-Anweisung definieren, wenn PostgreSQL mit?
-
19-08-2019 - |
Frage
Ich habe eine Anwendung gebaut auf ASP.NET 3.5 und PostgreSQL 8.3. Meine Datenbank hat 3 Benutzer, ein Datum Inhaber (xxx-Inhaber), ein Dateneditor (xxx-Editor) und ein Datum-Viewer (xxx-Viewer). Jeder Benutzer verfügt über ihr eigenes Schema xxx-Schema, xxx-Editor-Schema und xxx-Viewer-Schema genannt. Alle Daten werden in xxx-Schema gespeichert.
Dies erfordert, dass ich das Schema angeben, wenn auf die Datenbank entweder als xxx-Editor oder xxx-Viewer Benutzer verbinden, wie im folgenden Ausschnitt 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. Doch es muss ein besserer Weg, um festzulegen, welches Schema verwendet werden soll. Ich möchte in der Lage sein, die String-Verkettung vollständig zu entfernen, wenn möglich.
Was ist der beste Weg, um das Schema zu definieren, die in der SQL-Anweisung verwendet werden?
EDIT
Die folgenden von der PostgreSQL Benutzerhandbuch sieht vielversprechend aus.
SearchPath -. Ändert Suchpfad angegeben und öffentliches Schema
Aus meinen begrenzten Tests funktioniert es gut in meiner Situation. Dies ist jedoch eine PostgreSQL einzige Lösung. Gibt es vielleicht eine Datenbank unabhängige Lösung, die meisten Datenbanken, sofern diese Funktionalität?
EDIT 2
Ich habe die Antwort markiert, unter dem ich führt das Schema-Lookup, um auf Datenbankebene zu ändern. Mit der folgenden Änderung muß ich nicht Code in meinen SQL-Anweisungen hinzuzufügen.
ALTER USER xxx-viewer SET search_path TO '$user', xxx, public, sde
Lösung
Sie können den Schema-Suchpfad auf einer Pro-Sitzung Basis eingestellt 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
Andere Tipps
Sie können auch tun:
SET SCHEMA 'myschema';
Diese Aussage ist das gleiche, die SET search_path TO myschema, public
aber mehr