Триггеры начинаются как быстрое решение и заканчиваются кошмаром обслуживания. Две большие проблемы с триггерами:
- Трудно увидеть, когда вызывается триггер. Вы можете легко написать оператор обновления, не зная, что триггер запустится.
- Когда триггеры начинают запускать другие триггеры, становится трудно сказать, что произойдет.
В качестве альтернативы, оберните доступ к таблице в хранимой процедуре. Например:
create table TestTable (productId int, price numeric(6,2))
insert into TestTable (productId, price) values (1,5.0)
go
create procedure dbo.IncreasePrice(
@productId int,
@newPrice numeric(6,2))
with execute as owner
as
begin
update dbo.TestTable
set price = @newPrice
where productId = @productId
and price <= @newPrice
return @@ROWCOUNT
end
go
Теперь, если вы попытаетесь уменьшить цену, процедура завершится ошибкой и вернет 0:
exec IncreasePrice 1, 4.0
select * from TestTable --> 1, 5.00
exec IncreasePrice 1, 6.0
select * from TestTable --> 1, 6.00
Хранимые процедуры довольно легко читаются. По сравнению с триггерами, они причинят вам гораздо меньше головной боли. Вы можете принудительно использовать хранимые процедуры, не предоставляя ни одному пользователю права на обновление таблиц. В любом случае, это хорошая практика.