2017-02-19 3 views
0

Я реализую вместо триггера UPDATE в SQL-сервере, хочу обновить все поля, не требуя кэширования значений из таблицы INSERTED, а затем установить его в поля в запросе UPDATE .. Как я могу это сделать?!Как обновлять все поля динамически вместо запуска UPDATE SQL Server

CREATE TRIGGER trg_Instead_updTable1 ON dbo.Table1 
INSTEAD OF UPDATE 
AS 
BEGIN 
    IF (UPDATE(ID)) 
      RAISERROR ('It is not allowed to update a Table1.ID', 16, 1) 
    ELSE 
      BEGIN 
       UPDATE dbo.Table1 
       SET * = (SELECT * FROM INSERTED JOIN DELETED ON INSERTED.ID = DELETED.ID) 
      END 
END 
+0

Что именно вы здесь делаете? Триггеры INSTEAD OF UPDATE обычно используются только тогда, когда вы хотите полностью обходить обычную логику обновления и делать что-то совершенно обычное. Кажется, вы действительно нуждаетесь в нормальной логике обновления. – mroach

+0

Sidenote: 'raiserror' с серьезностью 16 не предотвращает создание обновлений. Вам нужно добавить 'rollback transaction', если вы хотите, чтобы обновление действительно было отменено. – mroach

+0

@mroach Я хочу отказаться от обновления идентификатора и принять любое другое обновление .. Я знаю, что этот код не показывает, что я только пытался получить доступ к нормальным значениям обновления, а затем напишу свой код. Извините, если это было fuzzy как-то –

ответ

1

Вам не нужно использовать в 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 
  1. RAISERROR будет, конечно, поднять ошибку, предупреждая пользователя о том, что они сделали что-то плохое. Можно предположить, что это остановит выполнение и откат обновления, но оно не делает (если XACT_ABORT не является ON).

  2. ROLLBACK TRANSACTION отменяет все обновление, восстанавливая таблицу до состояния, в котором оно находилось до того, как была предпринята попытка UPDATE.

  3. 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, вы все равно не можете его обновлять, что устраняет необходимость в таком триггере.

+2

'UPDATE()' не проверяет, изменилось ли значение. лучше сравнить значение между вставленными и удаленными таблицами. –

Смежные вопросы