触发器存在的陷阱

一、触发器是一种特殊的存储过程,不能被显式调用,只能在对表进行insert、update、delete操作时被自动激活。所以触发器可以用来实现对表进行复杂的完整性约束。

二、 Sql Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表由系统来维护,它们存在于内存中而不是数据库中。这两个表的结构总是与被该触发器作用的表的结构相同,触发器执行完成后,与该触发器相关的这两个表也被删除。 

对表的操作

Inserted逻辑表

Deleted逻辑表

增加记录(insert)

存放增加的记录

删除记录(delete)

存放被删除的记录

修改记录(update)

存放更新后的记录

存放更新前的记录

陷阱:update触发器只会被update触发一次,无论更新的记录数是多少

Alter TRIGGER dbo.tmp_table1_update ON tmp_table1  
AFTER UPDATE  
AS  
SELECT * INTO #INS FROM INSERTED  
DECLARE @PersonCode VARCHAR(20),@Amount MONEY  
IF UPDATE(Amount)  
BEGIN  
    DECLARE AmountCursor CURSOR FOR  
    SELECT personcode,Amount FROM #INS  
    OPEN AmountCursor  
    FETCH NEXT FROM AmountCursor INTO @PersonCode,@Amount  
    WHILE @@FETCH_STATUS=0  
    BEGIN  
        UPDATE TMP_TABLE2 SET Amount =@Amount WHERE PersonCode=@PersonCode  
        FETCH NEXT FROM AmountCursor INTO @PersonCode,@Amount  
    END  
    CLOSE AmountCursor  
    DEALLOCATE AmountCursor           
END  
原文地址:https://www.cnblogs.com/xiangzhong/p/4971862.html