Раньше я был сторонником хранимых процедур, но недавно сменил позицию.
Одна из проблем с хранимыми процедурами заключается в том, что все ваши запросы должны быть определены заранее, а все запросы должны быть определены в хранимой процедуре. Скажем, например, я хочу запросить пользователей с определенным именем, и фамилия не начинается с «а», и нет уже хранимой процедуры, делающей это (вероятно, нет), я должен написать новую один. И это одна новая хранимая процедура для обработки одной конкретной функции. В последнем проекте базы данных, над которым я работал, количество хранимых процедур росло из-за новых способов запроса тех же данных.
В моем текущем приложении я динамически генерирую SQL-запросы на основе лямбда-выражений. Это позволяет мне запрашивать любую комбинацию свойств в объектах моего домена и позволяет слою доступа к данным преобразовать его в действительный запрос SQL.
Теперь у меня намного меньше кода, его легче понять, и, что важнее, гораздо быстрее реализовать новую функцию. Однако иногда я использую хранимые процедуры для вставки и обновления данных, поскольку они позволяют мне проверять недействительные данные и прерывать транзакцию, если данные недействительны.
А как насчет безопасности? Традиционно, хранимые процедуры дают преимущество в плане безопасности, так как вы можете скрыть свои таблицы и предоставлять только хранимые процедуры и указывать, какой пользователь имеет доступ к какой хранимой процедуре. Но кто создает приложения, в которых клиент больше обращается к базе данных?
Я бы всегда располагал своего рода прикладным уровнем поверх базы данных, работающей где-то как служба (веб-служба, служба windows, веб-приложение и т. Д.), И эта служба будет обеспечивать безопасность. Ни один пользователь не может получить прямой доступ к базе данных.