標籤:style blog color 使用 io strong for ar
- 觸發器是一張表的增刪改操作,引起或觸發對另一張表的增刪改操作,所以觸發器便有3種類型,分別是deleted觸發器,Update觸發器,insert觸發器
- 觸發器又根據替換原來的增刪改操作,還是在原來的增刪改完成之後進行增刪改操作,分為Instead of觸發器和For或者After觸發器(for和after屬於一種觸發器)
- 觸發器的使用涉及到兩張非常重要的表用來儲存已經改變或者已經在第一章被操作的表上不存在的記錄,分別是虛擬表Inserted和虛擬表Deleted
|
虛擬表Inserted |
虛擬表Deleted |
在表記錄新增時 |
存放新增的記錄 |
不儲存記錄 |
修改時 |
存放用來更新的新記錄 |
存放更新前的記錄 |
刪除時 |
不儲存記錄 |
存放被刪除的記錄 |
- 下面舉一個在機房收費系統重構個人版中用到的易於理解的關於觸發器的小例子
- 在我們刪除T_OnWork_info表中的正在上機工作記錄時,同時向T_Work_info表中寫入工作記錄,還同時將T_Admin_info表中的IsOn欄位改為False
CREATE TRIGGER trigger_delOnWork ON T_OnWork_info FOR DELETE AS DECLARE @name varchar(10)DECLARE @loginDate varchar(10)DECLARE @loginTime varchar(10)DECLARE @logoutDate varchar(10)DECLARE @logoutTime varchar(10)DECLARE @comName varchar(10) SELECT @name =(SELECT NAME FROM deleted )SELECT @loginDate =(SELECT loginDate FROM deleted )-----deleted表用於儲存T_OnWork表中已經刪除的記錄SELECT @loginTime =(sELECT loginTime FROM deleted )SELECT @comName =(SELECT comName FROM deleted )SET @logoutDate=convert(varchar(10),getdate(),101)SET @logoutTime =convert(varchar(10),getdate(),108) if (SELECT COUNT(*) FROM deleted )=1 BEGIN INSERT INTO T_Work_info(Name,loginDate,loginTime,logoutDate,logoutTime,comName) VALUES(@name,@loginDate ,@loginTime ,@logoutDate,@logoutTime,@comName ) UPDATE T_Admin_info SET IsOn='False' WHERE Name=(SELECT Name FROM deleted ) ROLLBACK TRAN --交易回復 END
怎麼樣,觸發器很簡單吧,大家可以嘗試著用用,觸發器+事務的復原機制,很容易地做到了為代碼減負