2012-03-16 6 views
5

güncellenmiş edilemez:mantıksal tabloları INSERTED ve ben</p> <pre><code>update INSERTED set ... </code></pre> <p>aşağıdaki hatayı alıyorum şu ifadeyi kullanırken SİLİNDİ

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 

cevap

6
:

The logical tables INSERTED and DELETED cannot be updated

Bu tetikleyici kodudur

Hata, eklendiğinde değiştiremeyeceğinizi söylüyor. Tablo Calcul zaten tetikleyici çağrıldığında ek tarafından sunulan satırları içerecektir; bu nedenle doğrudan bu veriler üzerinde çalışırsınız. Aynı anda birden fazla satır eklemek bir olasılık olduğu için, yerel değişkenler ile çalışmak ama bir sette çalışmak olmamalıdır:

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 

o zaman eklenen satırlar arasında adıma cursor kullanmalıdır nedense kümesi kullanmak yapamıyorsanız .

Not: Calcul'ın ID adında bir birincil anahtarı olduğunu varsayalım; Tetikleyicileri ele alırken kesinlikle bir tane gerekir.

DÜZENLEME:

SET NOCOUNT ON

operasyonda etkilendi kaç satır diyerek müşteriye mesaj dönmemeyi SQL Sunucusu talimatını verir. Genellikle tetikleyicilerinde, orijinal sorgudaki satır sayısını (tetikleyiciyi tetikleyen ekleme, güncelleştirme veya silme) çelişen bilgileri göndermekten kaçınmak için kullanılır. Seçimi de bu mesaja geri dönecek olursak her tetikleyicinin başına koymak en iyisidir.

+0

çalıştım ve zamanımı kurtardım –

İlgili konular