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