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

          BEFORE ( EXECUTE PROCEDURE log_customer_proc( ) ); -- 觸發(fā)動作
                上面的實例在customer表中創(chuàng)建了一個名為delete_customer的delete類型的觸發(fā)器。這個觸發(fā)器將在customer中的一條或者多條數(shù)據(jù)做刪除操作時被執(zhí)行。當這個觸發(fā)器被觸發(fā)時,在這之前需要執(zhí)行l(wèi)og_customer_proc存儲過程來記錄日志。
                 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ā)動作
                 這個實例在stock表中創(chuàng)建了一個名為update_unit_price的update觸發(fā)器。這個觸發(fā)器會在unit_price字段被更新時執(zhí)行。當這個觸發(fā)器起作用的時候,觸發(fā)器的動作將在每一條滿足post.unit_price > pre.unit_price*2條件時的記錄。
                 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ā)動作
                  這個實例在customer表上創(chuàng)建了一個名為select_customer的select觸發(fā)器。這個觸發(fā)器將在在num列被查詢的時候被執(zhí)行。對每條被影響的行都進行如下的操作:
          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ā)動作
                 這個實例在customer表中創(chuàng)建了一個名為insert_customer的insert類型的觸發(fā)器。這個觸發(fā)器影響在customer表中插入的每一行。在該表記錄插入時,觸發(fā)器附加執(zhí)行了如下操作:
          INSERT INTO customer_summary VALUES (post.num, post.name);
                5)觸發(fā)存儲過程
                在該實例中展示如何在觸發(fā)器中調(diào)用存儲過程,例如如下創(chuàng)建了items_trigger_proc的存儲過程:
          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存儲過程,參考語句如下:
          CREATE TRIGGER update_quantity
          UPDATE OF quantity ON items
          FOR EACH ROW
          (
          EXECUTE PROCEDURE items_trigger_proc()
          WITH TRIGGER REFERENCES);
          4、觸發(fā)器的優(yōu)點
                 觸發(fā)器可通過數(shù)據(jù)庫中的相關表實現(xiàn)級聯(lián)更改;不過,通過級聯(lián)引用完整性約束可以更有效地執(zhí)行這些更改。觸發(fā)器可以強制比用 CHECK 約束定義的約束更為復雜的約束。與 CHECK 約束不同,觸發(fā)器可以引用其它表中的列。例如,觸發(fā)器可以使用另一個表中的 SELECT 比較插入或更新的數(shù)據(jù),以及執(zhí)行其它操作,如修改數(shù)據(jù)或顯示用戶定義錯誤信息。觸發(fā)器也可以評估數(shù)據(jù)修改前后的表狀態(tài),并根據(jù)其差異采取對策。一個表中的多個同類觸發(fā)器(INSERT、UPDATE 或 DELETE)允許采取多個不同的對策以響應同一個修改語句。

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

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

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

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關注blog

          積分與排名

          • 積分 - 2296321
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 长宁县| 浮梁县| 土默特右旗| 房产| 黔西县| 八宿县| 浠水县| 霍邱县| 山东| 东乡县| 蒲城县| 乌兰浩特市| 深水埗区| 青岛市| 中牟县| 县级市| 蓝田县| 东城区| 沙河市| 承德市| 宽甸| 侯马市| 甘南县| 平泉县| 陕西省| 巩留县| 叶城县| 正安县| 汝城县| 清流县| 区。| 靖西县| 武邑县| 乐陵市| 松原市| 偃师市| 类乌齐县| 辽阳县| 沭阳县| 沾益县| 巴林右旗|