首先我們看看觸發器是什麼?
觸發器,由於我先認識的儲存過程+事務。所以我在這裡把他稱為儲存過程的小兄弟,至於為什麼,由於他們真的非常像,對於儲存過程,大家能夠在了解,這裡就不具體的介紹了。可是觸發器是什麼呢?
觸發器是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=@cardid
這個過程假設須要執行多次呢,大家每次都要用兩條語句來組合這乙個過程,是不是麻煩了點,於是如今就有了觸發器這個過程,那麼我來為大家來展示一下觸發器的同樣實現。
create 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
這裡我們大家解釋一下。這個流程是怎麼回事,首先我們要執行的語句就是insert recharge_info into (cardid,addmoney...) values(@cardid,addmoney...),那麼觸發器當你在插入資料的時候,就會將資訊儲存到inserted中,然後我們再依據須要把裡邊的資料取出來。用來更新我們須要更新的表。
在觸發器中,我們有兩張表。一張是deleted表。一張inserted表。這兩張是虛擬表,用用完之後資料庫會自己主動刪除。
以下我用**的形式將他們的用處展現出來
對錶的操作
inserted邏輯表
deleted邏輯表
新增記錄(insert)
存放新增的記錄 無
刪除記錄(delete) 無
存放被刪除的記錄
改動記錄(update)
存放更新後的記錄
存放更新前的記錄
所以我們在執行操作的時候,人們會說觸發器是同一時候操作的。事實上不是的,觸發器把我們前邊說的insert recharge_info into (cardid,addmoney...) values(@cardid,addmoney...。update student_info set cash=cash+addmoney where cardid=@cardid 自己把邏輯問題給結局了,從而省的我們再寫兩僅僅三條語句去組合,用一次還好。那麼用多次呢?
但是觸發器也不是越多越好,由於他是體如今資料庫中的一段**,不會呈如今程式中,所以這在開發的階段加幾個或許不是問題。但是假設要是以後咱們的系統出現故障了。那麼要改動這方面就顯得有點難了,觸發器越是多越是會造成邏輯上的困難,所以建議大家用能夠,適當的用。
最後為大家獻上建立各種觸發器的一些小demo
insert觸發器
createdelete觸發器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
fordelete --刪除觸發
asprint
'備份資料中……';
if (object_id('classesbackup', 'u') is
notnull)
--存在classesbackup,直接插入資料
insert into classesbackup select name, createdate from deleted;
else
--不存在classesbackup建立再插入
select * into classesbackup from deleted;
'備份資料成功!
update觸發器
create;trigger tgr_classes_update
on classes
forupdate
asdeclare @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 + '%';
'級聯改動資料成功!
endelse
'無需改動student表!
; 乙個觸發器,乙個儲存過程。乙個全自己主動。乙個隨意呼叫,都能讓程式執行的更快,占用的資源更少。雖然看上去也非常像。功能貌似給我們降低了非常多的壓力,可是在寫的時候。或者說是在設計資料庫的時候,我們還是要慎重的用,否者我們會給軟體以後的執行帶來難以想象的痛苦。
機房收費系統之觸發器的使用
不過這次敲個人版機房收費系統,自己實際去運用了一下觸發器,感覺它太給力了,節省了很多不必要的 了,減輕了系統的負擔。還節省了很多時間。真是既省時又省力。廢話不多說了,接下來在簡單嘮叨幾句什麼是觸發器,觸發器的好處以及注意事項和自己在機房時所用的觸發器例項。觸發器 trigger 是sql serve...
機房收費系統之結尾
機房收費系統在這個冬月告乙個不完美的結局,剛開始接觸他的時候,各種糾結,各種逃避,各種不想做,接觸乙個新的事物,內心充滿了恐懼與排斥,機房收費系統與學生管理系統不一樣,沒有原始碼,這個時候,需要自己不斷的給予自己鼓勵,七 期的師哥師姐都做出來了,你完全有理由相信,自己也能做出來。機房收費系統來來回回...
機房收費系統之思路
機房收費系統的資料放在手裡已經有好一段時間了,卻遲遲沒有開始動工。不知道是對它產生的牴觸心理,還是自己本身就好懶。總是放著不肯前進。但是這幾天看到同學們的進度都好快,有的甚至都已經結束了。不能再偷懶了,話說進度不用太趕,但是自己心裡還是很著急的。畢竟大家的起跑點都是一樣的,怎麼能夠在半路落在別人身後...