觸發器設計技巧與實例

          ?????在數據庫設計中,有兩種方法可設定自動化的資料處理規則,一種是條件約束,
          一種是觸發器,一般而言,條件約束比觸發器較容易設定及維護,且執行效率較
          好,但條件約束只能對資料進行簡單的欄位檢核,當涉及到多表操作等復雜操
          作時,就要用到觸發器了.
          ????? 一個數據庫系統中有兩個虛擬表用于存儲在表中記錄改動的信息,分別
          ?是:
          ???????????????? 虛擬表Inserted??????????????????? 虛擬表Deleted

          在表記錄新增時?? 存放新增的記錄??????????????????????? 不存儲記錄
          ??????? 修改時?? 存放用來更新的新記錄????????????????? 存放更新前的記錄
          ??????? 刪除時?? 不存儲記錄??????????????????????????? 存放被刪除的記錄
          ?
          ????? 觸發器的種類及觸發時機
          ?After觸發器:觸發時機在資料已變動完成后,它將對變動資料進行必要的
          ????????????? 善后與處理,若發現有錯誤,則用事務回滾(Rollback Transaction)
          ????????????? 將此次操作所更動的資料全部回復。
          ?Istead of 觸發器:觸發時機在資料變動前發生,且資料如何變動取決于觸發器

          現在介紹一下創建觸發器的編寫格式:

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

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

          實例1:
          ???? 在訂單(表orders)中的訂購數量(列名為num)有變動時,觸發器會先到客戶(表Customer)中
          取得該用戶的信用等級(列名為Level),然后再到信用額度(Creit)中取出該等級
          許可的訂購數量上下限,最后比較訂單中的訂購數量是否符合限制。

          代碼:?????????
          ?????????? 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','客戶的訂購數量不符合限制'
          ?????????????? end??
          ???????????? end?
          實例2:
          ????? 有工資管理系統中,當公司對某員工甲的月薪進行調整時,通常會先在表員工中修改薪資列,然后在
          ????? 表員工記錄中修改薪資調整時間與薪資
          ???????????
          ????????? Create trigger compensation
          ????????? on 員工
          ????????? after update
          ????????? as
          ??????????? if @@rowcount=0 return
          ??????????? if update(薪資)
          ?????????????? begin
          ???????????????? insert 員工記錄
          ???????????????? select 員工遍號,薪資,getdate()
          ???????????????? from inserted
          ?????????????? end



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

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

          導航

          統計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          Java技術網站

          友情鏈接

          國內一些開源網站

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阜南县| 特克斯县| 汉川市| 咸丰县| 垦利县| 枝江市| 辽宁省| 荔浦县| 武平县| 苍南县| 甘德县| 锡林浩特市| 隆尧县| 靖边县| 合川市| 堆龙德庆县| 安康市| 万宁市| 惠来县| 高陵县| 丹阳市| 沭阳县| 育儿| 水富县| 长垣县| 临澧县| 饶平县| 武功县| 班玛县| 阳泉市| 黑山县| 张家港市| 和田市| 大安市| 于都县| 石门县| 治多县| 徐州市| 松江区| 屯昌县| 平南县|