<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 297,  comments - 1618,  trackbacks - 0
    1、簡(jiǎn)介
           觸發(fā)器(trigger)是個(gè)特殊的存儲(chǔ)過(guò)程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng),而是由事件來(lái)觸發(fā),比如當(dāng)對(duì)一個(gè)表或者視圖進(jìn)行操作( insert,delete, update)時(shí)就會(huì)激活它執(zhí)行。觸發(fā)器經(jīng)常用于加強(qiáng)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等。
           觸發(fā)器也可用于強(qiáng)制引用完整性,以便在多個(gè)表中添加、更新或刪除行時(shí),保留在這些表之間所定義的關(guān)系。然而,強(qiáng)制引用完整性的最好方法是在相關(guān)表中定義主鍵和外鍵約束。如果使用數(shù)據(jù)庫(kù)關(guān)系圖,則可以在表之間創(chuàng)建關(guān)系以自動(dòng)創(chuàng)建外鍵約束。
          在觸發(fā)器中的操作可以是insert、update、delete、execute procedure或execute function操作。
          在一個(gè)表或視圖上,可以有多個(gè)insert、update、select或delete的觸發(fā)器。
    2、重要概念
            1)觸發(fā)器名稱
            標(biāo)識(shí)一個(gè)觸發(fā)器,并在在數(shù)據(jù)庫(kù)中必須保持唯一性。
            2)觸發(fā)事件
                   i) 數(shù)據(jù)庫(kù)語(yǔ)句能啟動(dòng)觸發(fā)器。觸發(fā)的事件可以是insert、update、delete或select語(yǔ)句;
                   ii)在update或select事件中,在觸發(fā)時(shí)可加上一個(gè)多個(gè)字段作為觸發(fā)條件;
                   iii)在insert或delete事件中,任何一個(gè)在表上的insert或delete操作都可以觸發(fā)觸發(fā)器;
                   iv)觸發(fā)器創(chuàng)建在本地表或視圖中。它不能被創(chuàng)建在遠(yuǎn)程數(shù)據(jù)庫(kù)的表或視圖中。
            3)觸發(fā)的動(dòng)作
                   i) 觸發(fā)的動(dòng)作指的是當(dāng)觸發(fā)事件發(fā)生時(shí),執(zhí)行的一些SQL語(yǔ)句;
                   ii)有三種類型的觸發(fā)動(dòng)作:before、after和for each row;
                   iii)before觸發(fā)動(dòng)作在觸發(fā)器事件發(fā)生之前執(zhí)行;
                   iv)after觸發(fā)動(dòng)作在觸發(fā)事件發(fā)生之后執(zhí)行;
                   v)for each row觸發(fā)動(dòng)作影響觸發(fā)事件發(fā)生的所有記錄之上;
                   vi)觸發(fā)動(dòng)作可以是insert、update、delete、execute procedure或execute function語(yǔ)句。
    3、觸發(fā)器實(shí)例
            1)delete觸發(fā)器
    CREATE TRIGGER delete_customer
    DELETE ON customer -- 觸發(fā)事件

    BEFORE ( EXECUTE PROCEDURE log_customer_proc( ) ); -- 觸發(fā)動(dòng)作
          上面的實(shí)例在customer表中創(chuàng)建了一個(gè)名為delete_customer的delete類型的觸發(fā)器。這個(gè)觸發(fā)器將在customer中的一條或者多條數(shù)據(jù)做刪除操作時(shí)被執(zhí)行。當(dāng)這個(gè)觸發(fā)器被觸發(fā)時(shí),在這之前需要執(zhí)行l(wèi)og_customer_proc存儲(chǔ)過(guò)程來(lái)記錄日志。
           2)update觸發(fā)器
    CREATE TRIGGER update_unit_price
    UPDATE OF unit_price ON stock -- 觸發(fā)事件 REFERENCING OLD AS pre NEW AS post

    FOR EACH ROW WHEN (post.unit_price > pre.unit_price * 2)
    INSERT INTO warn_table VALUES
    (pre.stock_num, pre.manu_code,
    pre.unit_price, post.unit_price, 
    CURRENT) ); -- 觸發(fā)動(dòng)作
           這個(gè)實(shí)例在stock表中創(chuàng)建了一個(gè)名為update_unit_price的update觸發(fā)器。這個(gè)觸發(fā)器會(huì)在unit_price字段被更新時(shí)執(zhí)行。當(dāng)這個(gè)觸發(fā)器起作用的時(shí)候,觸發(fā)器的動(dòng)作將在每一條滿足post.unit_price > pre.unit_price*2條件時(shí)的記錄。
           3)select的觸發(fā)器
    CREATE TRIGGER select_customer_num
        
    SELECT OF num ON customer -- 觸發(fā)事件

        REFERENCING OLD AS pre
        
    FOR
     EACH ROW
            (
    INSERT INTO scn_log VALUES (pre.num, CURRENTUSER) ); -- 觸發(fā)動(dòng)作
            這個(gè)實(shí)例在customer表上創(chuàng)建了一個(gè)名為select_customer的select觸發(fā)器。這個(gè)觸發(fā)器將在在num列被查詢的時(shí)候被執(zhí)行。對(duì)每條被影響的行都進(jìn)行如下的操作:
    INSERT INTO scn_log VALUES (pre.num, CURRENTUSER);
           4)insert的觸發(fā)器
    CREATE TRIGGER insert_customer
         
    INSERT ON customer -- 觸發(fā)事件
             REFERENCING NEW AS post
             
    FOR EACH ROW
            (
    INSERT INTO customer_summary VALUES (post.num, post.name)); -- 觸發(fā)動(dòng)作
           這個(gè)實(shí)例在customer表中創(chuàng)建了一個(gè)名為insert_customer的insert類型的觸發(fā)器。這個(gè)觸發(fā)器影響在customer表中插入的每一行。在該表記錄插入時(shí),觸發(fā)器附加執(zhí)行了如下操作:
    INSERT INTO customer_summary VALUES (post.num, post.name);
          5)觸發(fā)存儲(chǔ)過(guò)程
          在該實(shí)例中展示如何在觸發(fā)器中調(diào)用存儲(chǔ)過(guò)程,例如如下創(chuàng)建了items_trigger_proc的存儲(chǔ)過(guò)程:
    CREATE PROCEDURE items_trigger_proc()
    REFERENCING OLD 
    AS pre NEW AS post FOR items;
    if (SELECTING) then
    insert into log_records values (1, pre.quantity, -1);
    end if
    if (INSERTING) then
    insert into log_records values (2-1, post.quantity);
    end if
    if (DELETING) then
    insert into log_records values (3, pre.quantity, -1);
    end if
    if (UPDATING) then
    insert into log_records values (4, pre.quantity, post.quantity);
    end if
    END PROCEDURE;
         接著創(chuàng)建update_quantity的觸發(fā)器,調(diào)用item_trigger_proc存儲(chǔ)過(guò)程,參考語(yǔ)句如下:
    CREATE TRIGGER update_quantity
    UPDATE OF quantity ON items
    FOR EACH ROW
    (
    EXECUTE PROCEDURE items_trigger_proc()
    WITH TRIGGER REFERENCES);
    4、觸發(fā)器的優(yōu)點(diǎn)
           觸發(fā)器可通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改;不過(guò),通過(guò)級(jí)聯(lián)引用完整性約束可以更有效地執(zhí)行這些更改。觸發(fā)器可以強(qiáng)制比用 CHECK 約束定義的約束更為復(fù)雜的約束。與 CHECK 約束不同,觸發(fā)器可以引用其它表中的列。例如,觸發(fā)器可以使用另一個(gè)表中的 SELECT 比較插入或更新的數(shù)據(jù),以及執(zhí)行其它操作,如修改數(shù)據(jù)或顯示用戶定義錯(cuò)誤信息。觸發(fā)器也可以評(píng)估數(shù)據(jù)修改前后的表狀態(tài),并根據(jù)其差異采取對(duì)策。一個(gè)表中的多個(gè)同類觸發(fā)器(INSERT、UPDATE 或 DELETE)允許采取多個(gè)不同的對(duì)策以響應(yīng)同一個(gè)修改語(yǔ)句。

    posted on 2010-11-05 16:42 阿蜜果 閱讀(2527) 評(píng)論(0)  編輯  收藏 所屬分類: database
    <2010年11月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

          生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來(lái)如此。
          我的作品:
          玩轉(zhuǎn)Axure RP  (2015年12月出版)
          

          Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊(cè)

    關(guān)注blog

    積分與排名

    • 積分 - 2294288
    • 排名 - 3

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲乱码中文字幕综合| 成人AV免费网址在线观看| 精品97国产免费人成视频| 色偷偷尼玛图亚洲综合| 亚洲av无码有乱码在线观看| 亚洲乱码av中文一区二区| 亚洲综合av一区二区三区| 亚洲一区二区三区丝袜| 亚洲av无码一区二区三区人妖 | 2015日韩永久免费视频播放| 色欲A∨无码蜜臀AV免费播| 黄页免费在线观看| 日本在线看片免费人成视频1000 | 黄人成a动漫片免费网站| 老司机精品视频免费| 成年大片免费视频播放一级| 在线播放免费人成视频网站| 一级做a爰性色毛片免费| 中国精品一级毛片免费播放| 久久亚洲免费视频| 1000部拍拍拍18勿入免费视频软件| 免费AA片少妇人AA片直播| 免费看的一级毛片| 亚洲国产精品狼友中文久久久| 亚洲香蕉成人AV网站在线观看| 亚洲国产人成在线观看69网站 | 亚洲综合激情另类专区| 亚洲精品午夜无码专区| 亚洲精品中文字幕乱码影院| 亚洲永久网址在线观看| 全黄A免费一级毛片| 女人体1963午夜免费视频| 和日本免费不卡在线v| 免费国产精品视频| 亚洲精品无码高潮喷水在线| 亚洲精品免费在线| 精品国产日韩亚洲一区91| 日韩免费高清播放器| 亚洲高清中文字幕免费| 免费a在线观看播放| 亚洲av福利无码无一区二区|