Прежде всего, как предположил Дэмиен, кажется, что это значение не следует хранить, а вычислять при необходимости.Когда у вас есть вычисленные столбцы (которые не обновляются автоматически), вы просите дополнительные задачи по обслуживанию (что произойдет, если кто-то изменит название продукта, но сохранит тот же идентификатор? И когда кто-то удалит ставку?)и бессмысленная обработка (вы можете рассчитать уровень ставки и получить другую ставку, прежде чем фактически потребуется текущий уровень ставки).
При этом вы можете сбросить рейтинг ставки с помощью триггера, которыйЭто должно быть после вставок, обновлений или удалений (вы не слишком много объясняете свою бизнес-логику).
CREATE TRIGGER tr_SetBiddingLevel ON Bids AFTER INSERT, UPDATE, DELETE
AS
BEGIN
-- If the amount was updated, a new row was added or a row was deleted
IF UPDATE(Amount) OR (
EXISTS (SELECT 1 FROM deleted) AND
NOT EXISTS (SELECT 1 FROM inserted))
BEGIN
;WITH NewBidLevels AS
(
SELECT
B.Id,
NewBidLevel = ROW_NUMBER() OVER (ORDER BY B.Amount ASC)
FROM
Bids AS B
)
UPDATE B SET
Bidding_Level = 'L' + CONVERT(VARCHAR(10), N.NewBidLevel)
FROM
Bids AS B
INNER JOIN NewBidLevels AS N ON B.Id = N.Id
END
END
Обратите внимание, что тигр будет рассматривать все записи таблицы ,так как он должен обновлять все записи для каждого изменения на любую сумму (что очень плохо сказывается на производительности).Вы должны вычислять этот рейтинг каждый раз, когда он необходим.