У меня есть образец таблицы ниже
Чтобы предотвратить ошибочные обновления или массовые обновления с толстыми пальцами, я хочу обеспечить соблюдение следующего правила
Для столбца Current_Checkpoint значение может быть обновлено ТОЛЬКО до следующего целого числа. Например, для Джона Смита следующее значение может быть только 2, а для Джейн Смит — только 4.
Обновление значения Current_Checkpoint Джона Смита до 3 (или любого значения, отличного от 2) должно быть отклонено базой данных.
Я считаю, что это будет триггер UPDATE, но мне понадобится помощь в его создании. Кроме того, имеет ли смысл проверочное ограничение для столбца или нет?
Большое спасибо.
Чтобы уточнить требование: нужно ли обновлять столбец до следующего целого числа в 100% случаев? Или только тогда, когда этот столбец вообще изменяется? Например, что, если бы в таблице был третий столбец (назовем его col_c), а у меня есть update SampleTable set col_c = 'foo' where Student = 'John Smith';
). Каковы ваши ожидания относительно допустимых значений Current_Checkpoint
?
Кроме того, если в конечном итоге это будет случай «в 100% случаев», похоже, вы заново изобретаете rowversion?
@BenThul, этот вопрос действительно пахнет проблемой X и Y. Кроме того, эти триггеры не останавливают ни удаление, ни многократное обновление значений. Уверен, ОП это действительно не нужно
but I would need help constructing it
помощь будет означать, что вы попытались и застряли... в нынешнем виде вы просите кого-то написать все это за вас.
@DaleK твоя отзывчивость не знает границ
Да, вам нужен триггер, чтобы обеспечить это. Соедините inserted
и deleted
в первичном ключе и выдайте ошибку, если обнаружите неверные строки.
CREATE OR ALTER TRIGGER CheckpointExactlyOne ON dbo.YourTable
FOR UPDATE
AS
SET NOCOUNT ON;
IF EXISTS (SELECT 1
FROM inserted i
JOIN deleted d ON d.YourPrimaryKey = i.YourPrimaryKey
WHERE i.Current_Checkpoint <> d.Current_Checkpoint + 1
)
THROW 50001, N'Must update Current_Checkpoint to exactly 1 more than existing value', 1;
@Yoav24 Да, ты прав, пропустил FOR UPDATE
, но THROW
делает откат.
@ yoav24 yoav24, этот ответ решил ваш вопрос?
Похоже на триггер UPDATE: вы можете проверить, отличается ли удаленная от вставленной контрольной точки более чем на 1, и выдать ошибку. Синтаксис триггера очень хорошо описан Learn.microsoft.com/en-us/sql/t-sql/statements/…