Ответ
Да, активно использовал хранимые процедуры (Stored Procedures) в SQL-серверах, таких как Microsoft SQL Server и PostgreSQL.
Основные причины для их применения:
- Инкапсуляция бизнес-логики на стороне БД: Сложные операции с данными выполняются одним вызовом.
- Производительность: План выполнения компилируется и кэшируется, что может быть эффективнее динамического SQL.
- Безопасность: Предоставление прав на выполнение процедуры вместо прямого доступа к таблицам (принцип наименьших привилегий).
- Сокращение сетевого трафика: Вместо нескольких запросов отправляется один вызов процедуры.
Пример процедуры в T-SQL (MS SQL Server):
CREATE PROCEDURE GetActiveUsers @MinOrderCount INT
AS
BEGIN
SELECT UserId, UserName, COUNT(OrderId) as OrderCount
FROM Users u
JOIN Orders o ON u.UserId = o.UserId
GROUP BY UserId, UserName
HAVING COUNT(OrderId) > @MinOrderCount
END
GO
-- Вызов из C# с помощью Dapper
var users = await connection.QueryAsync<User>(
"GetActiveUsers",
new { MinOrderCount = 5 },
commandType: CommandType.StoredProcedure
);
Когда стоит избегать:
- Логика, тесно связанная с приложением, а не с данными.
- Проекты, где важна переносимость между разными СУБД.
- Ситуации, где предпочтительна прозрачность ORM (хотя многие ORM, как Entity Framework, поддерживают вызов процедур).