ASP.NET 3.5 と PostgreSQL 8.3 で構築されたアプリケーションがあります。私のデータベースには、データ所有者 (xxx-owner)、データ編集者 (xxx-editor)、およびデータ閲覧者 (xxx-viewer) の 3 人のユーザーがいます。各ユーザーには、xxx-schema、xxx-editor-schema、および xxx-viewer-schema と呼ばれる独自のスキーマがあります。すべてのデータは xxx-schema に保存されます。
これには、次のスニペットに示すように、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 ステートメントで使用されるスキーマを定義する最良の方法は何ですか?
編集
PostgreSQL User Manualの以下は有望に見えます。
SearchPath - 検索パスを指定されたパブリック スキーマに変更します。
私の限られたテストから、私の状況では問題なく動作します。ただし、これは PostgreSQL のみのソリューションです。おそらくデータベースに依存しないソリューションはありますか?ほとんどのデータベースはそのような機能を提供していますか?
編集2
以下の回答にマークを付けたので、データベース レベルでスキーマの検索順序を変更することになりました。次の変更により、SQL ステートメントにコードを追加する必要がなくなりました。
ALTER USER xxx-viewer SET search_path TO '$user', xxx, public, sde