觸發(fā)器設(shè)計(jì)技巧與實(shí)例

          ?????在數(shù)據(jù)庫(kù)設(shè)計(jì)中,有兩種方法可設(shè)定自動(dòng)化的資料處理規(guī)則,一種是條件約束,
          一種是觸發(fā)器,一般而言,條件約束比觸發(fā)器較容易設(shè)定及維護(hù),且執(zhí)行效率較
          好,但條件約束只能對(duì)資料進(jìn)行簡(jiǎn)單的欄位檢核,當(dāng)涉及到多表操作等復(fù)雜操
          作時(shí),就要用到觸發(fā)器了.
          ????? 一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中有兩個(gè)虛擬表用于存儲(chǔ)在表中記錄改動(dòng)的信息,分別
          ?是:
          ???????????????? 虛擬表Inserted??????????????????? 虛擬表Deleted

          在表記錄新增時(shí)?? 存放新增的記錄??????????????????????? 不存儲(chǔ)記錄
          ??????? 修改時(shí)?? 存放用來(lái)更新的新記錄????????????????? 存放更新前的記錄
          ??????? 刪除時(shí)?? 不存儲(chǔ)記錄??????????????????????????? 存放被刪除的記錄
          ?
          ????? 觸發(fā)器的種類及觸發(fā)時(shí)機(jī)
          ?After觸發(fā)器:觸發(fā)時(shí)機(jī)在資料已變動(dòng)完成后,它將對(duì)變動(dòng)資料進(jìn)行必要的
          ????????????? 善后與處理,若發(fā)現(xiàn)有錯(cuò)誤,則用事務(wù)回滾(Rollback Transaction)
          ????????????? 將此次操作所更動(dòng)的資料全部回復(fù)。
          ?Istead of 觸發(fā)器:觸發(fā)時(shí)機(jī)在資料變動(dòng)前發(fā)生,且資料如何變動(dòng)取決于觸發(fā)器

          現(xiàn)在介紹一下創(chuàng)建觸發(fā)器的編寫(xiě)格式:

          After類型:
          ??? Create Trigger? 觸發(fā)器名稱
          ??? on 表名
          ??? after 操作(insert,update)
          ??? as?
          ????? Sql語(yǔ)句

          Instead類型
          ??? Create Trigger 觸發(fā)器名稱
          ??? on 表名
          ??? Instead of 操作(update,delete)
          ??? as
          ????? Sql語(yǔ)句

          實(shí)例1:
          ???? 在訂單(表orders)中的訂購(gòu)數(shù)量(列名為num)有變動(dòng)時(shí),觸發(fā)器會(huì)先到客戶(表Customer)中
          取得該用戶的信用等級(jí)(列名為L(zhǎng)evel),然后再到信用額度(Creit)中取出該等級(jí)
          許可的訂購(gòu)數(shù)量上下限,最后比較訂單中的訂購(gòu)數(shù)量是否符合限制。

          代碼:?????????
          ?????????? Create? Trigger num_check
          ?????????? on orders
          ?????????? after insert,update
          ?????????? as
          ?????????? if update(num)
          ???????????? begin
          ?????????????? if exists(select a.* from orders a join customer b on a.customerid=b.customerid
          ????????????????????????????????????????????????? join creit c on b.level=c.level
          ????????????????????????????????????????????????? where a.num between c.up and c.down)
          ?????????????? begin
          ????????????????? rollback transaction
          ????????????????? exec master..xp_sendmail 'administrator','客戶的訂購(gòu)數(shù)量不符合限制'
          ?????????????? end??
          ???????????? end?
          實(shí)例2:
          ????? 有工資管理系統(tǒng)中,當(dāng)公司對(duì)某員工甲的月薪進(jìn)行調(diào)整時(shí),通常會(huì)先在表員工中修改薪資列,然后在
          ????? 表員工記錄中修改薪資調(diào)整時(shí)間與薪資
          ???????????
          ????????? Create trigger compensation
          ????????? on 員工
          ????????? after update
          ????????? as
          ??????????? if @@rowcount=0 return
          ??????????? if update(薪資)
          ?????????????? begin
          ???????????????? insert 員工記錄
          ???????????????? select 員工遍號(hào),薪資,getdate()
          ???????????????? from inserted
          ?????????????? end



          posted on 2006-08-07 12:09 nbt 閱讀(570) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)技術(shù)

          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊(cè)

          收藏夾

          Java技術(shù)網(wǎng)站

          友情鏈接

          國(guó)內(nèi)一些開(kāi)源網(wǎng)站

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 卫辉市| 芦山县| 信阳市| 贡嘎县| 桐城市| 齐河县| 中牟县| 蕉岭县| 南川市| 宝丰县| 桐城市| 宁夏| 大港区| 衡南县| 衡东县| 梅河口市| 长治县| 英吉沙县| 阜城县| 罗甸县| 喀喇沁旗| 方城县| 富川| 南安市| 德州市| 新田县| 东城区| 太谷县| 通河县| 兰溪市| 遂平县| 安阳市| 醴陵市| 方城县| 荆州市| 河间市| 吴堡县| 湛江市| 乳山市| 昌平区| 岳池县|