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

Ответ

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

Ответ 18+ 🔞

Ну, ты знаешь, я с этими хранимыми процедурами в 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, которая всё прозрачно делает (хотя многие, как Entity Framework, процедуры вызывать умеют, но это уже костыли, блядь).