更新在sql server中写入的触发器中的表

更新在sql server中写入的触发器中的表

问题描述:

我想创建一个触发器,当插入,删除发生在表'Abschaetzung_has_Varianten'中时触发,并更新一个名为'Flag'的表。我需要从同一个表中选择一个ID来更新标志表。在编写ID的SELECT时语法是否错误?我似乎没有从选择中获得@abschID。任何人都可以帮助我。谢谢。更新在sql server中写入的触发器中的表

CREATE TRIGGER trig_update_flag on [Abschaetzung_has_Varianten] 
after insert, delete 
As 
Begin 
    DECLARE @x INT; 
    DECLARE @abschID INT; 
    DECLARE @value INT; 
    SELECT @value = 1; 
    SELECT @abschID = (SELECT TOP 1 Abschaetzung_ID FROM Abschaetzung_has_Varianten ORDER BY Abschaetzung_ID DESC); 
    SELECT @x = Count(*) FROM Flag WHERE AbschaetzID = @abschID 
    If @x > 0 
    Begin 
     UPDATE Flag Set [Flag] = @value WHERE AbschaetzID = @abschID; 
    end 
end 
+0

首先,您通常使用INSERTED,DELETED伪表,而不是原始表。其次这些表格可能有多个记录,所以你需要编写你的触发器来允许。 – 2014-09-04 12:49:25

你的代码应该是更多这样的:

CREATE TRIGGER trig_update_flag on [Abschaetzung_has_Varianten] 
after insert, delete 
as 
begin 
UPDATE Flag Set [Flag] = 1 
WHERE AbschaetzID IN (SELECT DISTINCT Abschaetzung_ID FROM INSERTED) 

UPDATE Flag Set [Flag] = 1 
WHERE AbschaetzID IN (SELECT DISTINCT Abschaetzung_ID FROM DELETED) 

end 

INSERTED是包含所有的更新或插入记录的特殊触发假表。

DELETED是一个特殊的触发伪表,其中包含所有已删除的记录。

此表可能包含一次触发调用的许多记录。

上面的代码并不是最高效的,可能并不适合您的具体要求,但希望您能明白。

+0

是的,它需要一点适应,但效果很好。谢谢您的帮助..!! – Shiva 2014-09-04 13:05:21