触发器存在的陷阱
一、触发器是一种特殊的存储过程,不能被显式调用,只能在对表进行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