2009-03-16 10 views
0

私は、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 

答えて

3

あなたが使用してセッションごとにスキーマ検索パスを設定することができます。

SET search_path TO myschema 

あなたが戻っpublicスキーマに落ちるしたい場合は、あなたが使用できます。

SET search_path TO myschema, public 
+0

ありがとう、これは素晴らしいです!さらに、私は永久に "ALTER USER xxx-viewer SET 'を使って各ユーザーのsearch_pathを変更しました。' $ user '、xxx、public、sde"このようにして、SQL文に追加のコードは必要ありません。 –

0

あなたもできる:

SET SCHEMA 'myschema';

このステートメントは同じSET search_path TO myschema, publicでも同じですが、