Логические таблицы INSERTED и DELETED не могут быть обновлены - PullRequest
5 голосов
/ 17 марта 2012

Когда я использую следующее утверждение

update INSERTED set ...

Я получаю следующую ошибку:

Невозможно обновить логические таблицы INSERTED и DELETED

Это код триггера:

create trigger TCalcul
on dbo.Calcul
after insert 
  as
  begin
   set nocount on;
   declare @Num1 int;
   declare @Num2 int;
   declare @Op varchar(1);
   set @Num1 = (select Num1 from inserted)
   set @Num2 = (select Num2 from inserted)
   set @Op = (select Op from inserted)
   if @Op = '+'
    update inserted set Resultat = @Num1 + @Num2 
    else if @Op = '-'
     update inserted set Resultat = @Num1 - @Num2 ;
         else if @Op = '*'
         update inserted set Resultat = @Num1 * @Num2 ;
              else if @Op = '/'
              update inserted set Resultat = @Num1 / @Num2 ;
  end
go

1 Ответ

6 голосов
/ 17 марта 2012

Как говорит ошибка, вы не можете изменить вставленный.Таблица Calcul уже будет содержать строки, представленные вставкой в ​​момент вызова триггера;поэтому вы работаете непосредственно с этими данными.Поскольку существует возможность вставки нескольких строк одновременно, вам не следует работать с локальными переменными, а работать с набором:

create trigger TCalcul
on dbo.Calcul
after insert 
as
begin

   set nocount on

   update Calcul 
          set Resultat = case Calcul.Op 
                              when '+' then Calcul.Num1 + Calcul.Num2
                              when '-' then Calcul.Num1 - Calcul.Num2
                              when '*' then Calcul.Num1 * Calcul.Num2
                              when '/' then Calcul.Num1 / Calcul.Num2
                              else null end
         from Calcul inner join Inserted on Calcul.ID = Inserted.ID
end
go

Если по какой-то причине вы не можете использовать set, то вам следует использовать курсор для перехода по вставленным строкам.

Примечание: я предполагаю, что у Calcul есть первичный ключ с именем ID;он вам определенно понадобится при работе с триггерами.

РЕДАКТИРОВАТЬ:

SET NOCOUNT ON указывает Sql Server не возвращать сообщение клиенту о том, сколько строк было затронутоОперация.Он часто используется в триггерах, чтобы избежать отправки информации, которая может конфликтовать с количеством строк исходного запроса (вставить, обновить или удалить, вызвавший срабатывание триггера).Лучше всего ставить его в начале каждого триггера, так как select также возвращает это сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...