印象里邊最早接觸觸發器是在耿建玲的視頻里邊見到的,但是完全不理解,但是在實現機房收費系統的時候,就發現原來SQL Server中還有這么一個強大的功能,簡直是和存儲過程合稱為最佳兄弟二人組。 首先我們看看觸發器是什么? 觸發器,因為我先認識的存儲過程+
印象里邊最早接觸觸發器是在耿建玲的視頻里邊見到的,但是完全不理解,但是在實現機房收費系統的時候,就發現原來SQL Server中還有這么一個強大的功能,簡直是和存儲過程合稱為最佳兄弟二人組。
首先我們看看觸發器是什么?
觸發器,因為我先認識的存儲過程+事務,所以我在這里把他稱為存儲過程的小兄弟,至于為什么,因為他們真的很像,對于存儲過程,大家可以在http://blog.csdn.net/lovemenghaibin/article/details/38235817了解,這里就不詳細的介紹了,但是觸發器是什么呢?
觸發器是SQL Server提供給程序員和數據分析員來保證數據完整性的一種方式,它就是與表事件相關的特殊存儲過程。觸發器不能被直接執行,只能為表上的Insert\Update\Delete事件所觸發。它也不能傳遞或接受參數。
觸發器可以查詢其他表,而且可以包含復雜的SQL語句。它們主要用于強制服從復雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。 比如說,我這里有兩張表,一張是充值表(Recharge_Info),一張是學生表(Student_Info),如果我們要進行充值行為,也就是要進行兩個動作,第一為學生表的錢加上充值的錢,第二就是為充值表里邊添加一條記錄,那么如果要完成這個操作,我們需要兩步,更新和插入信息,也就說我們會這樣 insert Recharge_Info into (cardID,addMoney...) values(@cardID,addMoney...) Update Student_Info set Cash=Cash+addMoney where cardID=@cardIDCREATE TRIGGER [dbo].[TR_charge_U] --創建觸發器 ON [dbo].[T_Recharge] --在T_ReCharge表 for insert 為了插入數據而需要執行的操作 AS --定義一些參數 declare @cardID char(10) --卡號 declare @cash decimal(10, 2) --卡內余額 declare @addmoney decimal(10, 2) --充值金額 if UPDATE(cash) BEGIN select @cardID =CardID from inserted --選擇充值表中的卡號 select @addmoney=cash from inserted --選擇我們充值表中的充值金額 select @cash =T_card.cash from T_Card --選擇卡內的余額 update T_Card set Cash=@cash+@addmoney where cardID =@cardID END
對表的操作 |
Inserted邏輯表 |
Deleted邏輯表 |
增加記錄(insert) |
存放增加的記錄 |
無 |
刪除記錄(delete) |
無 |
存放被刪除的記錄 |
修改記錄(update) |
存放更新后的記錄 |
存放更新前的記錄 |
create trigger tgr_classes_insert on classes for insert --插入觸發 as --定義變量 declare @id int, @name varchar(20), @temp int; --在inserted表中查詢已經插入記錄信息 select @id = id, @name = name from inserted; set @name = @name + convert(varchar, @id); set @temp = @id / 2; insert into student values(@name, 18 + @id, @temp, @id);
create trigger tgr_classes_delete on classes for delete --刪除觸發 as print '備份數據中……'; if (object_id('classesBackup', 'U') is not null) --存在classesBackup,直接插入數據 insert into classesBackup select name, createDate from deleted; else --不存在classesBackup創建再插入 select * into classesBackup from deleted; print '備份數據成功!';
create trigger tgr_classes_update on classes for update as declare @oldName varchar(20), @newName varchar(20); --更新前的數據 select @oldName = name from deleted; if (exists (select * from student where name like '%'+ @oldName + '%')) begin --更新后的數據 select @newName = name from inserted; update student set name = replace(name, @oldName, @newName) where name like '%'+ @oldName + '%'; print '級聯修改數據成功!'; end else print '無需修改student表!';
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com