觸發器是類似於儲存程式的資料庫物件,它響應資料庫環境下的某個請求。SQL Sever 2005包含3個觸發器對象:AFTER,資料定義語言 (Data Definition Language) (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資料庫大綱的問題,並且取代資料修改一組標準視圖集。
範例
<b>Listing A</b>
CREATE TABLE Products
(
ProductID SMALLINT IDENTITY(1,1) PRIMARY KEY,
Description VARCHAR(75),
Price MONEY NOT NULL
)
GO
CREATE TABLE Purchases
(
PurchaseID SMALLINT IDENTITY(1,1) PRIMARY KEY,
ProductID SMALLINT REFERENCES Products(ProductID),
PurchasePrice MONEY NOT NULL,
PurchaseDate SMALLDATETIME DEFAULT(GETDATE())
)
為了更好地說明可更新視圖概念,我們提供一個樣本。在本例中,我們設計一個產品表(記錄產品),一個購買表(記錄購買)。Listing A包含了建立表的指令碼,運行此指令碼後則得到樣本中所要用到的表。運行Listing B指令碼向表中添加資料。
<b>Listing B</b>
INSERT INTO Products(Description, Price) VALUES('Television',500)
INSERT INTO Products(Description, Price) VALUES('VCR',100)
INSERT INTO Products(Description, Price) VALUES('DVD_Player',125)
INSERT INTO Products(Description, Price) VALUES('Alarm_Clock',40)
INSERT INTO Products(Description, Price) VALUES('Camera',325)
INSERT INTO Products(Description, Price) VALUES('Projector',1500)
INSERT INTO Products(Description, Price) VALUES('XBox',400)
GO
INSERT INTO Purchases(ProductID, PurchasePrice) VALUES(1, 500)
INSERT INTO Purchases(ProductID, PurchasePrice) VALUES(5, 325)
INSERT INTO Purchases(ProductID, PurchasePrice) VALUES(1, 525)
GO
現在表中已經有資料了,我可以為這些表建立一些有意義的視圖。請查看Listing C。
<b>isting C</b>
CREATE VIEW vw_ProductPurchases
AS
SELECT
pr.ProductID,
pr.Description,
pr.Price AS ProductPrice,
pu.PurchasePrice,
pu.PurchaseDate
FROM
Products pr
INNER JOIN Purchases pu ON pr.ProductID = pu.ProductID
GO