SQL觸發器中的inserted表和deleted表
簡介:開發也有年頭了,但是觸發器確實用的比較少,但是無容置疑觸發器確實不錯,
最近項目要求需要用到的觸發器特別多、頻繁,覺得很有必要記錄和積累下。
在觸發器語句中用兩個特殊的表一個是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
- --合同修改 Begin
- --觸發器是插入還是更新 Begin
- --通過對 Inserted邏輯表 Deleted邏輯表 的判斷
- --來確認是插入 還是更新
- DECLARE @DFlag BIT = 0
- DECLARE @IFlag BIT = 0
- IF EXISTS(SELECT * FROM DELETED)
- SET @DFlag = 1
- IF EXISTS(SELECT * FROM INSERTED)
- SET @IFlag = 1
- --觸發器是插入還是更新 End
- --修改合同的時候
- IF @IFlag = 1 AND @DFlag = 1
- IF update(new_dept_contract_r1) and exists(
- select * from INSERTED i left join DELETED d
- on i.New_contractId = d.New_contractId where i.new_dept_contract_r1 <> d.new_dept_contract_r1
- )
- begin
- --替換部門Code
- declare @oldcode nvarchar(10),@newcode nvarchar(10),@contractid uniqueidentifier
- select
- @oldcode = ‘-‘+old.New_dept_code+‘-‘
- ,@newcode = ‘-‘+new.New_dept_code+‘-‘
- ,@contractid = i.New_contractId
- from INSERTED i
- left join DELETED d on i.New_contractId = d.New_contractId
- left join dbo.A new on i.new_dept_contract_r1 = new.New_deptId
- left join dbo.A old on d.new_dept_contract_r1 = old.New_deptId
- update B
- set new_contract_name = replace(new_contract_name,@oldcode,@newcode)
- where New_contractId= @contractid
- end
- --合同修改 End
SQL觸發器中的inserted表和deleted表