觸發器是類似於存儲程序的數據庫對象,它響應數據庫環境下的某個請求。SQL Sever 2005包含3個觸發器對象:AFTER,數據定義語言 (DDL)和INSTEAD-OF。
AFTER觸發器是存儲程序,它發生於數據操作語句作用之後,例如刪除語句等。DDL是SQL Server 2005的新觸發器,允許響應數據庫引擎中對象定義水平事件(例如:DROP TABLE語句)。INSTEAD-OF觸發器是對象,在數據庫引擎中可以取代數據操作語句而執行。例如:將INSTEAD-OF INSERT觸發器附加到表,告訴數據庫執行此觸發器。
使用INSTEAD-OF觸發器的理由
INSTEAD-OF觸發器是SQL Sever功能強大的對象,允許開發人員轉移數據庫引擎完成不同的工作,以滿足開發要求。其中的一個例子是在數據庫的表中添加INSTEAD-OF觸發器,當不需要修改表時,可以對表的內容進行回滾。使用此方法時,必須格外小心,因為任何指定的表修改之前,INSTEAD-OF觸發器必須處於激活狀態。
使用INSTEAD-OF觸發器一個更充分理由是視圖處理。在視圖中添加INSTEAD-OF觸發器後,則可創建更新的視圖。可更新視圖允許完整地提取數據庫大綱,因此可以用此方法設計系統,而不需要擔心OLTP數據庫大綱的問題,並且取代數據修改一組標准視圖集。
范例
為了更好地說明可更新視圖概念,我們提供一個示例。在本例中,我們設計一個產品表(記錄產品),一個購買表(記錄購買)。Listing A包含了創建表的腳本,運行此腳本後則得到示例中所要用到的表。運行Listing B腳本向表中添加數據。
現在表中已經有數據了,我可以為這些表創建一些有意義的視圖。請查看Listing C。
這是個典型的產品水平的視圖。它聯合了數據庫中的兩個表,使得數據簡單化了。但是,對於數據提取,使用視圖則沒有什麼優勢。在視圖上附上INSTEAD-OF觸發器後,則允許修改表,但是我不需要直接修改表中的數據。我使用Listing D中的代碼在vw_ProductPurchases視圖上創建一個INSTEAD-OF觸發器。
請注意此INSTEAD OF觸發器的聲明。SQL Server創建的默認的觸發器為AFTER觸發器,因此,必須在觸發器定義中指定INSTEAD OF子句。
觸發器的第一條語句是“check”語句。本例中我使用此語句檢測INSERTED表以確保顯示ProductID字段,並且保證提供顯示其他PurchasePrice 或 ProductPrice字段。