您好,登錄后才能下訂單哦!
觸發(fā)器
其是一種特殊的存儲(chǔ)過程。一般的存儲(chǔ)過程是通過存儲(chǔ)過程名直接調(diào)用,而觸發(fā)器主要是
通過事件(增、刪、改)進(jìn)行觸發(fā)而被執(zhí)行的。其在表中數(shù)據(jù)發(fā)生變化時(shí)自動(dòng)強(qiáng)制執(zhí)行。
常見的觸發(fā)器有兩種:after(for)、instead of,用于insert、update、delete事件。
after(for) 表示執(zhí)行代碼后,執(zhí)行觸發(fā)器
instead of 表示執(zhí)行代碼前,用已經(jīng)寫好的觸發(fā)器代替你的操作
觸發(fā)器語法:
create trigger 觸發(fā)器的名字 on 操作表
for|after instead of
update|insert|delete
as
SQL語句
觸發(fā)器的特征:
1、觸發(fā)器是在對(duì)表進(jìn)行增、刪、改時(shí),自動(dòng)執(zhí)行的存儲(chǔ)過程。觸發(fā)器常用于強(qiáng)制業(yè)務(wù)規(guī)則,它是一種高級(jí)約束,通過事件進(jìn)行觸發(fā)而被執(zhí)行。
2、觸發(fā)器是一個(gè)特殊的事務(wù)單元,可以引用其他表中的列執(zhí)行特殊的業(yè)務(wù)規(guī)則或數(shù)據(jù)邏輯關(guān)系。當(dāng)出現(xiàn)錯(cuò)誤時(shí),可以執(zhí)行rollback transaction操作將整個(gè)觸發(fā)器以及觸發(fā)它的T-SQL語句一并回滾(不需顯示聲明begin transaction)。
3、每個(gè)觸發(fā)器將用到的兩個(gè)臨時(shí)表:
deleted 臨時(shí)表:用于臨時(shí)存放被刪除的記錄行副本(包括delete和update語句所影響的數(shù)據(jù)行);
注意:被刪除的記錄行,首先從原始表中刪除,并保存到觸發(fā)器表。然后從觸發(fā)器表中刪除,再保存到deleted表。
inserted臨時(shí)表:用于臨時(shí)存放插入的記錄行副本(包括insert和update語句所影響的數(shù)據(jù)行);
deleted表和inserted表的特征:
> 這兩個(gè)表的表結(jié)構(gòu)與該觸發(fā)器作用的表相同;
> 這兩個(gè)表是邏輯表,并且由系統(tǒng)管理;
> 這兩個(gè)表是動(dòng)態(tài)駐留在內(nèi)存中的(不是存儲(chǔ)在數(shù)據(jù)庫中),當(dāng)觸發(fā)器工作完成后,它們也被刪除;
> 這兩個(gè)表是只讀的,即只能運(yùn)用select語句查看(用戶不能直接更改);
4、所創(chuàng)建的觸發(fā)器(insert、delete、update)是在原表數(shù)據(jù)行已經(jīng)修改完成后再觸發(fā)。所以,觸發(fā)器是在約束檢查之后才執(zhí)行。
--禁止用戶插入數(shù)據(jù)(實(shí)際上是先插入,然后立刻將其刪除!)
create trigger tr_insert on bank
for --for表示執(zhí)行之后的操作
insert --即先執(zhí)行了插入操作,同時(shí)在臨時(shí)表中保存了插入記錄
as
--執(zhí)行完插入之后,在新生成的表中將剛剛插入的那條記錄刪除,
--而此時(shí)得到的剛剛插入的記錄的id是通過臨時(shí)表 inserted得到的
delete * from bank where cid=(select cid from inserted)
生成上面的觸發(fā)器后,當(dāng)用戶再輸入insert語句后就見不到效果了!
如:insert into bank values('0004',10000),是插入不進(jìn)數(shù)據(jù)庫的。
--刪除誰就讓誰的賬戶加上10元
create trigger tr_dalete on bank
instead of
delete
as
update bank balance=balance+10 where cid=(select cid from deleted)
生成這個(gè)觸發(fā)器之后,當(dāng)用戶輸入delete語句后,對(duì)應(yīng)的那個(gè)id不但沒有被刪除掉,而且他的賬戶增加了10元
如:delete from bank where cid='0002',執(zhí)行完這句話后,編號(hào)為0002的賬戶會(huì)增加10元
參考文章:http://www.cnblogs.com/xugang/archive/2010/02/20/1669619.html
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。