爪哇咖啡館

          我為J狂

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            11 隨筆 :: 2 文章 :: 39 評論 :: 0 Trackbacks

          設(shè)計觸發(fā)器

          觸發(fā)器是一種特殊類型的存儲過程,它不同于我們前面介紹過的存儲過程。觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行的,而存儲過程可以通過存儲過程名字而被直接調(diào)用。當(dāng)對某一表進(jìn)行諸如UPDATE、 INSERT、 DELETE 這些操作時,SQL Server 就會自動執(zhí)行觸發(fā)器所定義的SQL 語句,從而確保對數(shù)據(jù)的處理必須符合由這些SQL 語句所定義的規(guī)則。
          觸發(fā)器的主要作用就是其能夠?qū)崿F(xiàn)由主鍵和外鍵所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)的一致性。除此之外,觸發(fā)器還有其它許多不同的功能:
          (1) 強(qiáng)化約束(Enforce restriction)
          觸發(fā)器能夠?qū)崿F(xiàn)比CHECK 語句更為復(fù)雜的約束。
          (2) 跟蹤變化Auditing changes
          觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,從而不允許數(shù)據(jù)庫中未經(jīng)許可的指定更新和變化。

          (3) 級聯(lián)運(yùn)行(Cascaded operation)。
          觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,并自動地級聯(lián)影響整個數(shù)據(jù)庫的各項內(nèi)容。例如,某個表上的觸發(fā)器中包含有對另外一個表的數(shù)據(jù)操作(如刪除,更新,插入)而該操作又導(dǎo)致該表上觸發(fā)器被觸發(fā)。
          (4) 存儲過程的調(diào)用(Stored procedure invocation)。
          為了響應(yīng)數(shù)據(jù)庫更新觸,發(fā)器可以調(diào)用一個或多個存儲過程,甚至可以通過外部過程的調(diào)用而在DBMS( 數(shù)據(jù)庫管理系統(tǒng))本身之外進(jìn)行操作。
          由此可見,觸發(fā)器可以解決高級形式的業(yè)務(wù)規(guī)則或復(fù)雜行為限制以及實(shí)現(xiàn)定制記錄等一些方面的問題。例如,觸發(fā)器能夠找出某一表在數(shù)據(jù)修改前后狀態(tài)發(fā)生的差異,并根據(jù)這種差異執(zhí)行一定的處理。此外一個表的同一類型(INSERT、 UPDATE、 DELETE)的多個觸發(fā)器能夠?qū)ν环N數(shù)據(jù)操作采取多種不同的處理。
          總體而言,觸發(fā)器性能通常比較低。當(dāng)運(yùn)行觸發(fā)器時,系統(tǒng)處理的大部分時間花費(fèi)在參照其它表的這一處理上,因為這些表既不在內(nèi)存中也不在數(shù)據(jù)庫設(shè)備上,而刪除表和插入表總是位于內(nèi)存中。可見觸發(fā)器所參照的其它表的位置決定了操作要花費(fèi)的時間長短

          在設(shè)計觸發(fā)器時,Microsoft® SQL Server™ 2000 提供了兩種選項:

          • 執(zhí)行 INSTEAD OF 觸發(fā)器代替通常的觸發(fā)動作。INSTEAD OF 觸發(fā)器還可在帶有一個或多個基表的視圖上定義,而在這些視圖上這些觸發(fā)器可擴(kuò)展視圖可支持的更新類型。

          • 在執(zhí)行了 INSERT、UPDATE 或 DELETE 語句操作之后執(zhí)行 AFTER 觸發(fā)器。指定 AFTER 與指定 FOR 相同,而后者是 SQL Server 早期版本中唯一可使用的選項。AFTER 觸發(fā)器只能在表上指定。

          該表比較 AFTER 觸發(fā)器和 INSTEAD OF 觸發(fā)器的功能。

          功能 AFTER 觸發(fā)器 INSTEAD OF 觸發(fā)器
          適用范圍 表和視圖
          每個表或視圖含觸發(fā)器數(shù)量 ()每個觸發(fā)動作(UPDATE、DELETE 和 INSERT)含多個觸發(fā)器 每個觸發(fā)動作(UPDATE、DELETE 和 INSERT)含一個觸發(fā)器
          級聯(lián)引用 不應(yīng)用任何限制 在作為級聯(lián)引用完整性約束目標(biāo)的表上限制應(yīng)用。
          執(zhí)行 晚于:
          • 約束處理

          • 聲明引用操作

          • inserteddeleted 表的創(chuàng)建

          • 觸發(fā)動作
          早于:
          • 約束處理

          代替:

          • 觸發(fā)動作

          晚于:

          • inserteddeleted 表的創(chuàng)建
          執(zhí)行順序 可指定第一個和最后一個執(zhí)行 不可用
          inserteddeleted 表中引用 textntext image 不允許 允許

          AFTER
            指定觸發(fā)器只有在觸發(fā) SQL 語句中指定的所有操作都已成功執(zhí)行后才激發(fā)。所有的引用級聯(lián)操作和約束檢查也必須成功完成后,才能執(zhí)行此觸發(fā)器。
            如果僅指定 FOR 關(guān)鍵字,則 AFTER 是默認(rèn)設(shè)置。
            不能在視圖上定義 AFTER 觸發(fā)器。

          INSTEAD OF
            指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā) SQL 語句,從而替代觸發(fā)語句的操作。
            在表或視圖上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發(fā)器。然而,可以在每個具有 INSTEAD OF 觸發(fā)器的視圖上定義視圖。
            INSTEAD OF 觸發(fā)器不能在 WITH CHECK OPTION 的可更新視圖上定義。如果向指定了 WITH CHECK OPTION 選項的可更新視圖添加 INSTEAD OF 觸發(fā)器,SQL Server 將產(chǎn)生一個錯誤。用戶必須用 ALTER VIEW 刪除該選項后才能定義 INSTEAD OF 觸發(fā)器。

          { [DELETE] [,] [INSERT] [,] [UPDATE] }
            是指定在表或視圖上執(zhí)行哪些數(shù)據(jù)修改語句時將激活觸發(fā)器的關(guān)鍵字。必須至少指定一個選項。在觸發(fā)器定義中允許使用以任意順序組合的這些關(guān)鍵字。如果指定的選項多于一個,需用逗號分隔這些選項。
            對于 INSTEAD OF 觸發(fā)器,不允許在具有 ON DELETE 級聯(lián)操作引用關(guān)系的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯(lián)操作引用關(guān)系的表上使用 UPDATE 選項。
          posted on 2007-04-27 16:24 哲藤峰子 閱讀(982) 評論(1)  編輯  收藏

          評論

          # re: SQL server 觸發(fā)器類別 2013-03-01 15:39 未來城市
          寫的很好  回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 巨鹿县| 玛曲县| 阿拉善左旗| 汽车| 太和县| 镶黄旗| 清新县| 济南市| 深州市| 云霄县| 佛山市| 韶山市| 宾川县| 鹤庆县| 会昌县| 防城港市| 庄浪县| 余庆县| 肥东县| 大洼县| 镇巴县| 陆川县| 龙南县| 芷江| 祥云县| 额济纳旗| 溆浦县| 湘西| 二连浩特市| 仁寿县| 淮安市| 卓资县| 泸水县| 哈密市| 麻城市| 乡城县| 贺兰县| 吴桥县| 柯坪县| 兴义市| 广昌县|