无法更新逻辑表INSERTED和DELETED

时间:2012-03-16 23:51:52

标签: sql sql-server sql-server-2008 triggers

当我使用以下声明时

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 个答案:

答案 0 :(得分:6)

由于错误说您无法更改插入。 Table Calcul将包含在调用触发器时由insert提交的行;因此,您可以直接操作该数据。由于有可能一次插入多行,因此您不应使用局部变量,而应使用集合:

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,则应使用cursor逐步插入插入的行。

注意:我假设Calcul有一个名为ID的主键;在处理触发器时你绝对需要一个。

编辑:

SET NOCOUNT ON指示Sql Server不向客户端返回消息,说明操作影响了多少行。它通常用在触发器中,以避免发送与原始查询的rowcount(插入,更新或删除触发触发器)相冲突的信息。最好将它放在每个触发器的开头,因为select也会返回此消息。