2009-03-17 3 views
1

Ранее я задал вопрос:Следует ли явно указывать схему в инструкции SQL?

Where (or how) should I define the schema in a select statement when using PostgreSQL?

Ответ, который я принял был изменить search_path для подключающегося пользователя, так что схема не должна быть указана в SQL. Однако теперь я задаюсь вопросом, следует ли всегда указывать схему в SQL, а не разрешать автоматическую вывод схемы по пути поиска. Похоже, что это будет более безопасный подход и будет более переносимым для других баз данных.

Этот вопрос отличается от предыдущего в том, что я хочу знать, какие рекомендации используются для определения схемы в SQL, а не как это можно сделать.

Следует ли явно указывать схему в инструкции SQL?

** Примечание. Я бы не стал жестко кодировать имя схемы, но разрешил бы ее настраивать через файл Web.config, чтобы схема могла меняться с одной установки на другую. **

ответ

2

Это плохая практика для схемы жесткого кода в операциях SQL.

Вы должны сохранить его в настройках приложения и выдать SET search_path после подключения к базе данных.

Если ваше приложение используется несколькими пользователями с их собственными схемами, ваша жизнь будет намного проще, если вы не укажете имя схемы в SQL.

Другими словами,

string query = "SELECT * FROM " + ConfigurationManager.AppSettings.Get("schema") + ".table"; 

является плохим способом;

SQLCommand("SET search_path = " + ConfigurationManager.AppSettings.Get("schema"), connection).ExecuteNonQuery(); 
string query = "SELECT * FROM table"; 

- это хороший способ.

+0

Возможно, я должен уточнить. Я бы не стал на самом деле жестко закодировать схему, но вместо этого разрешил бы ее настраивать с помощью настройки Web.config. В этом случае было бы более целесообразным включить схему в SQL? –

+0

Можете ли вы подробнее рассказать о том, почему один рекомендуется по другому? Я знаю, что во втором примере путь search_path установлен только для этого сеанса, но я не понимаю, почему это преимущество перед первым примером. –

+0

Легче писать; его легче отлаживать; легче хранить запросы как ресурсы; вам не нужно добавлять ConfigurationManager.AppSettings.Get («схема») к каждой таблице в соединении. – Quassnoi

0

Давайте посмотрим - в БД приложения, которое я поддерживаю, есть около десятка схем. Каким будет порядок, если я положу их в «search_path»? И я бы включил в конфигурацию имена схем (а не имена таблиц, а не полностью квалифицированные имена таблиц)?

Как вы уже догадались, я не использую «search_path». Но, может быть, вы могли бы хранить полностью квалифицированные имена таблиц в конфигурации, если вы когда-нибудь передумаете об именах схем или самих таблиц.