2012-03-16 18 views
5

Quando uso la seguente dichiarazioneLe tabelle logiche inserted e deleted non possono essere aggiornati

update INSERTED set ... 

ottengo il seguente errore:

The logical tables INSERTED and DELETED cannot be updated

Questo è il codice di attivazione:

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 

risposta

6

Come l'errore dice che non puoi cambiare inserito. La tabella Calcul conterrà già le righe inviate da insert al momento in cui viene chiamato il trigger; quindi tu operi direttamente su quei dati. Poiché v'è una possibilità di inserire più righe contemporaneamente, non si deve lavorare con variabili locali ma lavora su un insieme:

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 

Se non è possibile utilizzare set per qualche motivo, si dovrebbe usare cursor per passare righe inserite .

Nota: presumo che Calcul abbia una chiave primaria denominata ID; ne avrai sicuramente bisogno quando gestisci i trigger.

EDIT:

SET NOCOUNT ON istruisce SQL Server non per restituire un messaggio al cliente dicendo quanti fila sono stati colpiti da un'operazione. Viene spesso utilizzato nei trigger per evitare l'invio di informazioni che potrebbero entrare in conflitto con il conteggio delle righe della query originale (inserimento, aggiornamento o eliminazione che ha attivato il trigger). È meglio metterlo all'inizio di ogni trigger, in quanto select restituirà anche questo messaggio.

+0

ha funzionato e salvato il mio tempo –

Problemi correlati