Руководство компании Дэвида не очень доверяло традиционной производственной последовательности отправить/пересобрать/развернуть. По их ощущениям, для этого требовалось слишком много шагов, и прорва времени. Организации требовалось внедрять изменения — в частности исправления ошибок — гораздо быстрее. Поэтому для решения проблемы они внимательно изучили процесс разработки, и аккуратно внесли в него необходимые изменения. Шучу. На самом деле они решили внедрить инновационную методику - «SQL Предложения».

Начальники пришли к выводу, что, так как большая часть их приложения манипулировала данными в базе данных, то большинство багов возникает в результате неправильных SQL запросов. Скорее всего, там было что-то вроде использования LEFT JOIN вместо INNER JOIN, или > вместо >=. Они решили, что раз уж в их приложении уже была база данных, — вы уже поняли к чему все идет — почему бы тогда не хранить все SQL запросы в этой базе данных?

Реализовать задумку поручили ведущему разработчику, который работал денно и нощно, чтобы в результате преобразовать ее в нечто чудовищное: библиотеку «SQL Предложения».

  • все SQL запросы до единого должны были храниться в таблице sql_sentences
  • чтобы не хардкодить назначение SQL запроса в его идентификаторе, каждому SQL предложению назначался четырехзначный шестнадцатиричный идентификатор - 0x00F9, 0xA004, и т.д. - вместо GET_ALL_CUSTOMERS
  • каждому предложению назначались привилегии, метод GetSQLSentence() выполнял несколько других запросов, чтобы убедиться в том, что пользователь имеет право выполнять запрос
  • дабы ублажить тех разработчиков, которые выступали против хранения SQL запросов в базе, была добавлена конфигурационная переменная “UseHardcodedSQL”

Чтобы, выполнить все эти требования разработчикам потребовалось изменить свой код примерно следующим образом...

string sql;
// @SQLSentence=0x02f0
if ((bool)(Configuration.GetValue("UseHardcodedSQL")))
{
    sql = "SELECT cust_name, cust_phone, cust_addr " +
          "  FROM customers WHERE cust_type='Active'";
}
else
{
    sql = DataConnector.GetSQLSentence(0x02f0);
}

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

Так как Дэвид еще не работал в компании, когда внедрялись эти изменения, то, как только он разобрался, что к чему, он спросил у ведущего разработчика, не доводилось ли ему когда-нибудь слышать о хранимых процедурах?

«Ага», ответил он, «но я еще слышал, что их чертовски трудно сопровождать».

Оригинал:http://thedailywtf.com/Articles/SQL-Sentences.aspx
Перевод:Евгений Виговский