Приходилось ли использовать хранимые процедуры в базах данных?

«Приходилось ли использовать хранимые процедуры в базах данных?» — вопрос из категории Базы данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, активно использовал хранимые процедуры (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, поддерживают вызов процедур).