批量更新的觸發器問題

原文鏈接:http://blog.csdn.net/baronyang/article/details/5174734

原來update觸發器只會被update觸發一次,無論更新的記錄數是多少,以下爲驗證代碼


[php] view plaincopy

  1. CREATE TABLE TMP_TABLE1 (PersonCode VARCHAR(20) NOT NULL PRIMARY KEY,[NAME] VARCHAR(50) NULL,DepCode VARCHAR(20) NULL,Amount MONEY null)  

  2. CREATE TABLE TMP_TABLE2 (PersonCode VARCHAR(20) NOT NULL PRIMARY KEY,[NAME] VARCHAR(50) NULL,DepCode VARCHAR(20) NULL,Amount MONEY null)  

  3.   

  4. GO  

  5. INSERT INTO TMP_TABLE1(PersonCode,[NAME],Amount)  

  6. VALUES('00001','AAA1',1000)  

  7. INSERT INTO TMP_TABLE1(PersonCode,[NAME],Amount)  

  8. VALUES('00002','AAA2',1000)  

  9. INSERT INTO TMP_TABLE1(PersonCode,[NAME],Amount)  

  10. VALUES('00003','AAA3',1000)  

  11. INSERT INTO TMP_TABLE1(PersonCode,[NAME],Amount)  

  12. VALUES('00004','AAA4',1000)  

  13. INSERT INTO TMP_TABLE1(PersonCode,[NAME],Amount)  

  14. VALUES('00005','AAA5',1000)  

  15.   

  16. INSERT INTO TMP_TABLE2(PersonCode,[NAME],Amount)  

  17. VALUES('00001','AAA1',1000)  

  18. INSERT INTO TMP_TABLE2(PersonCode,[NAME],Amount)  

  19. VALUES('00002','AAA2',1000)  

  20. INSERT INTO TMP_TABLE2(PersonCode,[NAME],Amount)  

  21. VALUES('00003','AAA3',1000)  

  22. INSERT INTO TMP_TABLE2(PersonCode,[NAME],Amount)  

  23. VALUES('00004','AAA4',1000)  

  24. INSERT INTO TMP_TABLE2(PersonCode,[NAME],Amount)  

  25. VALUES('00005','AAA5',1000)  

  26.   

  27. GO  

  28. Alter TRIGGER dbo.tmp_table1_update ON tmp_table1  

  29. AFTER UPDATE  

  30. AS  

  31. SELECT * INTO #INS FROM INSERTED  

  32. DECLARE @PersonCode VARCHAR(20),@Amount MONEY  

  33. IF UPDATE(Amount)  

  34. BEGIN  

  35.   SELECT @personcode=personcode,@Amount=Amount FROM #INS  

  36.   UPDATE TMP_TABLE2 SET Amount =@Amount WHERE PersonCode=@PersonCode      

  37. END  

  38.   

  39. GO  

  40.   

  41. UPDATE TMP_TABLE1 SET Amount = 2000  

  42. select * from TMP_TABLE1  

  43. SELECT * FROM TMP_TABLE2  


然後再更新,發現TMP_TABLE1的Amount字段值都更新爲2000,但TMP_TABLE2的Amount值只有第一條記錄更新了,下面改一下觸發器



  1. Alter TRIGGER dbo.tmp_table1_update ON tmp_table1  

  2. AFTER UPDATE  

  3. AS  

  4. SELECT * INTO #INS FROM INSERTED  

  5. DECLARE @PersonCode VARCHAR(20),@Amount MONEY  

  6. IF UPDATE(Amount)  

  7. BEGIN  

  8.     DECLARE AmountCursor CURSOR FOR  

  9.     SELECT personcode,Amount FROM #INS  

  10.     OPEN AmountCursor  

  11.     FETCH NEXT FROM AmountCursor INTO @PersonCode,@Amount  

  12.     WHILE @@FETCH_STATUS=0--0爲Fetch語句已成功,-1爲Fetch語句失敗或不在結果集中,-2提取的行不存在

  13.     BEGIN  

  14.         UPDATE TMP_TABLE2 SET Amount =@Amount WHERE PersonCode=@PersonCode  

  15.         FETCH NEXT FROM AmountCursor INTO @PersonCode,@Amount  

  16.     END  

  17.     CLOSE AmountCursor  

  18.     DEALLOCATE AmountCursor           

  19. END  


更新觸發器後,一切正常。

總結:爲了保險起見,update觸發器還是要用遊標來處理,才能保證全部觸發執行.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章