Должна ли схема всегда явно определяться в операторе SQL?

Раньше я задавал вопрос:

Где ( или как) я должен определить схему в операторе select при использовании PostgreSQL?

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

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

Должна ли схема всегда явно определяться в операторе SQL?

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


person Ryan Taylor    schedule 17.03.2009    source источник


Ответы (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";

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

person Quassnoi    schedule 17.03.2009
comment
Я должен, вероятно, уточнить. На самом деле я бы не стал жестко кодировать схему, а вместо этого позволил бы настраивать ее с помощью параметра Web.config. В этом случае было бы более целесообразно включить схему в SQL? - person Ryan Taylor; 17.03.2009
comment
Можете ли вы подробнее рассказать о том, почему один рекомендуется по сравнению с другим? Я знаю, что во втором примере search_path установлен только для этого сеанса, но мне не ясно, почему это преимущество по сравнению с первым примером. - person Ryan Taylor; 17.03.2009
comment
Писать легче; легче отлаживать; проще хранить сами запросы в качестве ресурсов; вам не нужно добавлять ConfigurationManager.AppSettings.Get(schema) к каждой таблице в соединении. - person Quassnoi; 17.03.2009
comment
Я думаю, это вполне очевидно :) - person Quassnoi; 17.03.2009
comment
Спасибо за быстрый отзыв! Для меня это имеет смысл, особенно возможность хранить запросы как ресурсы. Я не думал об этом. Кроме того, npgsql позволяет мне установить search_path в строке подключения, удаляя еще больше беспорядка в коде. Спасибо!! - person Ryan Taylor; 17.03.2009

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

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

person Milen A. Radev    schedule 17.03.2009