2009-03-16 4 views
0

У меня есть приложение, построенное на ASP.NET 3.5 и PostgreSQL 8.3. В моей базе данных есть 3 пользователя, владелец данных (xxx-owner), редактор данных (xxx-редактор) и средство просмотра данных (xxx-viewer). У каждого пользователя есть своя схема, называемая xxx-schema, xxx-editor-schema и xxx-viewer-schema. Все данные хранятся в xxx-схеме.Где (или как) следует определить схему в инструкции select при использовании PostgreSQL?

Это требует, чтобы я указывал схему при подключении к базе данных как пользователей xxx-редактора или 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 

Если вы хотите, чтобы возвратиться к публичной схеме, вы можете использовать:

SET search_path TO myschema, public 
+0

Спасибо, это работает! Кроме того, я постоянно изменял путь поиска для каждого пользователя с помощью «ALTER USER xxx-viewer SET search_path TO« $ user », xxx, public, sde« Таким образом, мне не нужен дополнительный код в моих операторах SQL. –

0

Вы также можете сделать:

SET SCHEMA 'myschema';

Это утверждение тем же, что SET search_path TO myschema, public но более