私は、ASP.NET 3.5とPostgreSQL 8.3に基づいてアプリケーションを構築しました。私のデータベースには、3人のユーザー、データ所有者(xxx-owner)、データエディタ(xxx-editor)、データビューア(xxx-viewer)があります。各ユーザーには、xxx-schema、xxx-editor-schema、xxx-viewer-schemaという独自のスキーマがあります。すべてのデータはxxx-schemaに格納されます。PostgreSQLを使用する場合、select文にスキーマを定義する必要がありますか?
これは、次のスニペットに示すように、xxx-editorユーザーまたはxxx-viewerユーザーとしてデータベースに接続するときにスキーマを指定する必要があります。
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;
私がこのルートを実行する場合、私はWeb.configでスキーマを指定します。ただし、使用するスキーマを指定するには、より良い方法が必要です。可能であれば、文字列連結を完全に削除したいと考えています。
SQL文で使用するスキーマを定義する最も良い方法は何ですか?
EDIT
PostgreSQL User Manualから次は有望に見えます。
SearchPath - 検索パスを指定されたパブリックスキーマに変更します。
私の限られたテストから、それは私の状況で問題なく動作します。しかし、これはPostgreSQLの唯一の解決策です。おそらく、データベースにとらわれないソリューションがありますか?ほとんどのデータベースでこのような機能が提供されていますか?
EDITは2
私は、データベースレベルでのスキーマの検索順序を変更するに私をリードし、それ以下の答えをマークしました。以下の変更で、SQL文にコードを追加する必要はありません。
ALTER USER xxx-viewer SET search_path TO '$user', xxx, public, sde
ありがとう、これは素晴らしいです!さらに、私は永久に "ALTER USER xxx-viewer SET 'を使って各ユーザーのsearch_pathを変更しました。' $ user '、xxx、public、sde"このようにして、SQL文に追加のコードは必要ありません。 –