почему бы не использовать вместо триггера обновления, а просто присоединиться к INSERTED и вставить все столбцы, кроме того, который вы не хотите обновлять? Ваш подход не учитывает, что один оператор UPDATE может повлиять на несколько строк.
попробуйте что-то вроде этого:
ALTER TRIGGER [dbo].[MyTrigger]
ON [dbo].[MyTable]
INSTEAD OF UPDATE
AS
BEGIN
UPDATE m
SET col1=INSERTED.col1
,col2=INSERTED.col2
,col4=INSERTED.col4
FROM [dbo].[MyTable] m
INNER JOIN INSERTED i ON m.PK=i.PK
END
Вы также можете попробовать что-то вроде этого:
ALTER TRIGGER [dbo].[MyTrigger]
ON [dbo].[MyTable]
AFTER UPDATE
AS
BEGIN
IF EXISTS(SELECT 1 FROM INSERTED i INNER JOIN DELETED d ON i.PK=d.PK WHERE i.SomeID!=d.SomeID OR (i.SomeID IS NULL AND d.SomeID IS NOT NULL) OR (d.SomeID IS NULL AND i.SomeID IS NOT NULL))
BEGIN
RAISERROR ('cannot change SomeID (source = [MyTrigger])', 16, 1)
ROLLBACK TRAN
RETURN
END
END
Это будет работать для обновлений нескольких строк. Кроме того, если «SomeID» НЕ равен NULL, вы можете удалить два условия OR
в IF EXISTS