Хранимые процедуры (stored procedures) — программируемые блоки, которые вызываются явным образом и могут принимать параметры, выполнять комплексную бизнес-логику, работу с транзакциями, возвращать наборы данных или выходные параметры.
Триггеры (triggers) — особые объекты, которые "автоматически" срабатывают на события изменения данных (INSERT, UPDATE, DELETE), обеспечивая прозрачное выполнение заданной логики при определённых действиях над таблицей.
Когда использовать процедуры
Когда использовать триггеры
Хранимая процедура:
CREATE PROCEDURE UpdateProductPrice @ProductID int, @NewPrice money AS BEGIN UPDATE Products SET Price = @NewPrice WHERE ProductID = @ProductID; END
Триггер:
CREATE TRIGGER trg_ProductsPriceChange ON Products AFTER UPDATE AS BEGIN INSERT INTO PriceAuditLog(ProductID, OldPrice, NewPrice, ChangeDate) SELECT i.ProductID, d.Price, i.Price, GETDATE() FROM inserted i JOIN deleted d ON i.ProductID = d.ProductID WHERE i.Price <> d.Price END
В: Можно ли определить порядок выполнения нескольких AFTER-триггеров на одной таблице в SQL Server стандартными средствами?
A: Нет, стандарт SQL не гарантирует порядок срабатывания AFTER-триггеров одной направленности на одной таблице. Если важен порядок — их следует объединять в один.
История
В CRM решении для поддержки функционала истории изменений применяли триггеры. Из-за высокой нагрузки от массовых обновлений записи в лог попадали с задержкой и блокировали "боевые" операции, что вызвало временную недоступность сервиса.
История
Разработчик создал логику проверки данных не в процедуре, а в триггере, ожидая, что изменения пользователь увидит мгновенно. Забыв, что триггер "прозрачен", он столкнулся с тем, что бизнес-логика стала неочевидной ("магией") и её сложно дебажить.
История
Важно: Часто процедуру вызывают внутри триггера, либо триггер из процедуры, что приводит к рекурсии и превышению лимита вложенности — например, автоматическая вставка приводит к повторному запуску триггера через связанную процедуру.