Может быть, вы хотите сделать это в триггере INSTEAD OF. Если кто-то попытается обновить этот столбец, вы можете удалить строку, в противном случае вы повторно выполните обновление. Единственная проблема здесь заключается в том, что вы должны перекодировать оператор обновления в триггере. (Кроме того, вам на самом деле не нужен дополнительный BEGIN TRAN / COMMIT TRAN внутри триггера.)
CREATE TRIGGER dbo.tr2_myTable
ON dbo.MyTable
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ON;
-- update the rows where the column hasn't changed
UPDATE s
SET col1 = i.col1, col2 = i.col2, ...
FROM dbo.MyTable AS s
INNER JOIN inserted AS i
ON s.key = i.key
INNER JOIN deleted AS d
ON i.key = d.key
AND i.column_that_should_not_change = d.column_that_should_not_change;
-- delete the rows where the column HAS changed
-- (note that this requirement sounds odd to me)
DELETE s
FROM dbo.MyTable AS s
INNER JOIN inserted AS i
ON s.key = i.key
INNER JOIN deleted AS d
ON i.key = d.key
AND i.column_that_should_not_change <> d.column_that_should_not_change;
END
GO
Обратите внимание, что в отличие от вашей логики IF UPDATE()
, этот триггер будет фактически обрабатывать несколько строк (например, некоторые, где этот столбец изменился, а некоторые, где он не изменился). Обратите внимание, что IF UPDATE(x)
будет истинным, даже если кто-то сказал UPDATE foo SET x = x;
.
Предполагается, что у вас есть ключевой столбец, и что column_that_should_not_change не может быть пустым. Если этот столбец допускает значения NULL, тогда логика становится немного более сложной.