Вам не нужно использовать в INSTEAD OF UPDATE
курок. Это необходимо только тогда, когда вы хотите полностью обойти все обычные правила обновления таблицы и сделать что-то совершенно обычное. Обычно это делается при установке триггера на сложный вид.
Вы сказали, что хотите отказаться от обновления значения. Нет проблем. Вы можете просто сделать это:
CREATE TRIGGER dbo.Table1_UPDATE on Table1 FOR UPDATE AS
IF UPDATE(ID)
BEGIN
RAISERROR('You may not update the ID', 16, -1)
ROLLBACK TRANSACTION
RETURN
END
GO
RAISERROR
будет, конечно, поднять ошибку, предупреждая пользователя о том, что они сделали что-то плохое. Можно предположить, что это остановит выполнение и откат обновления, но оно не делает (если XACT_ABORT
не является ON
).
ROLLBACK TRANSACTION
отменяет все обновление, восстанавливая таблицу до состояния, в котором оно находилось до того, как была предпринята попытка UPDATE
.
RETURN
выходит из кода запуска. Вероятно, нет необходимости продолжать дальнейшую обработку.
Если вы хотите обновить базовую таблицу, вот как вы это делаете:
UPDATE t1 SET
field1 = i.field1,
field2 = i.field2,
-- all additional fields go here
FROM Table1 t1
INNER JOIN inserted i ON i.id = t1.id
inserted
представляет собой виртуальную таблицу, содержащую всю строку в комплекте с новыми значениями. deleted
имеет строки, которые были перед вставкой. Таким образом, они могут использоваться, чтобы увидеть, какие значения изменены.
Sidenote: Если поле представляет собой столбец IDENTITY
, вы все равно не можете его обновлять, что устраняет необходимость в таком триггере.
Что именно вы здесь делаете? Триггеры INSTEAD OF UPDATE обычно используются только тогда, когда вы хотите полностью обходить обычную логику обновления и делать что-то совершенно обычное. Кажется, вы действительно нуждаетесь в нормальной логике обновления. – mroach
Sidenote: 'raiserror' с серьезностью 16 не предотвращает создание обновлений. Вам нужно добавить 'rollback transaction', если вы хотите, чтобы обновление действительно было отменено. – mroach
@mroach Я хочу отказаться от обновления идентификатора и принять любое другое обновление .. Я знаю, что этот код не показывает, что я только пытался получить доступ к нормальным значениям обновления, а затем напишу свой код. Извините, если это было fuzzy как-то –