1. 程式人生 > >SQL觸發器中的inserted表和deleted表

SQL觸發器中的inserted表和deleted表

plain add log and 處理 highlight del 兩個 from

簡介:開發也有年頭了,但是觸發器確實用的比較少,但是無容置疑觸發器確實不錯,

最近項目要求需要用到的觸發器特別多、頻繁,覺得很有必要記錄和積累下。

在觸發器語句中用兩個特殊的表一個是deleted表和inserted。

它們是通過觸發器操作自動創建駐留在內存中的臨時表。

--------------------------------------------------------------------------------------------------------------------------------------------

描述:

Deleted表用於存儲 DELETE和 UPDATE語句所影響的行的復本。在執行DELETE或 UPDATE語句時,行從觸發器表中刪除,並傳輸到 deleted表中。Deleted表和觸發器表通常沒有相同的行。

Inserted 表用於存儲 INSERT 和 UPDATE 語句所影響的行的副本。在一個插入或更新事務處理中,新建行被同時添加到 inserted 表和觸發器表中。Inserted 表中的行是觸發器表中新行的副本。

綜上可以總結一下:

觸發器的操作

deleted表和inserted表的數據變化

插入操作(Insert)

Inserted表有數據,Deleted表無數據

刪除操作(Delete)

Inserted表無數據,Deleted表有數據

更新操作(Update)

Inserted表有數據(新數據),Deleted表有數據(舊數據)

--------------------------------------------------------------------------------------------------------------------------------------------

實踐:

下面將以觸發器中的修改業務為例講述Inserted和Deleted的結合操作;

在合同中根據編號部門改變而修改合同號;
在合同管理系統中生成的合同編號,
如對應部門修改,合同編號中對應部門代碼對應修改,流水號不變;

修改前:15-TV-56-0996

修改後:15-TV-GB-0996

[sql] view plain copy
  1. --合同修改 Begin
  2. --觸發器是插入還是更新 Begin
  3. --通過對 Inserted邏輯表 Deleted邏輯表 的判斷
  4. --來確認是插入 還是更新
  5. DECLARE @DFlag BIT = 0
  6. DECLARE @IFlag BIT = 0
  7. IF EXISTS(SELECT * FROM DELETED)
  8. SET @DFlag = 1
  9. IF EXISTS(SELECT * FROM INSERTED)
  10. SET @IFlag = 1
  11. --觸發器是插入還是更新 End
  12. --修改合同的時候
  13. IF @IFlag = 1 AND @DFlag = 1
  14. IF update(new_dept_contract_r1) and exists(
  15. select * from INSERTED i left join DELETED d
  16. on i.New_contractId = d.New_contractId where i.new_dept_contract_r1 <> d.new_dept_contract_r1
  17. )
  18. begin
  19. --替換部門Code
  20. declare @oldcode nvarchar(10),@newcode nvarchar(10),@contractid uniqueidentifier
  21. select
  22. @oldcode = ‘-‘+old.New_dept_code+‘-‘
  23. ,@newcode = ‘-‘+new.New_dept_code+‘-‘
  24. ,@contractid = i.New_contractId
  25. from INSERTED i
  26. left join DELETED d on i.New_contractId = d.New_contractId
  27. left join dbo.A new on i.new_dept_contract_r1 = new.New_deptId
  28. left join dbo.A old on d.new_dept_contract_r1 = old.New_deptId
  29. update B
  30. set new_contract_name = replace(new_contract_name,@oldcode,@newcode)
  31. where New_contractId= @contractid
  32. end
  33. --合同修改 End


SQL觸發器中的inserted表和deleted表