如何使用SQL Server INSTEAD-OF触发器
2007-05-19 09:43:04 来源:WEB开发网核心提示: 这是个典型的产品水平的视图,它联合了数据库中的两个表,如何使用SQL Server INSTEAD-OF触发器(3),使得数据简单化了,但是, KY的一家银行工作,有7年的IT工作经验,对于数据提取,使用视图则没有什么优势
这是个典型的产品水平的视图。它联合了数据库中的两个表,使得数据简单化了。但是,对于数据提取,使用视图则没有什么优势。在视图上附上INSTEAD-OF触发器后,则允许修改表,但是我不需要直接修改表中的数据。我使用Listing D中的代码在vw_ProductPurchases视图上创建一个INSTEAD-OF触发器。
<b>Listing D</b>
CREATE TRIGGER tr_vwProductPurchases ON vw_ProductPurchases
INSTEAD OF INSERT
AS
BEGIN
IF EXISTS
(
SELECT TOP 1 *
FROM INSERTED
WHERE
ProductID IS NOT NULL AND
ISNULL(COALESCE(PurchasePrice, ProductPrice),0)>0
)
BEGIN
INSERT INTO Purchases
(
ProductID, PurchasePrice, PurchaseDate
)
SELECT
i.ProductID, COALESCE(PurchasePrice, ProductPrice), ISNULL(PurchaseDate, GETDATE())
FROM INSERTED i
END
ELSE
BEGIN
PRINT 'Adequate data not provided.'
END
END
请注意此INSTEAD OF触发器的声明。SQL Server创建的默认的触发器为AFTER触发器,因此,必须在触发器定义中指定INSTEAD OF子句。
触发器的第一条语句是“check”语句。本例中我使用此语句检测INSERTED表以确保显示ProductID字段,并且保证提供显示其他PurchasePrice 或 ProductPrice字段。
如果必要的数据通过INSERT语句都插入到视图中,则触发器将插入指定的值到数据表。下面即是视图的INSERT语句。 INSERT INTO vw_ProductPurchases(ProductID, PurchasePrice) VALUES(1, 700)
INSERT语句提供了有效的ProductID和PurchasePrice,这意味着新记录插入到Purchases表。
结论
INSTEAD-OF触发器具有强大的功能和灵活性。如果系统不大,使用视图系统提取数据大纲能够极大保护数据库程序。
上面的例子很简单,系统中所用到的复杂的触发器需要考虑安全性问题、时间开销和其他限制。
Tim Chapman是一个 SQL Server数据库管理员,他在Louisville, KY的一家银行工作,有7年的IT工作经验,通过了微软SQL Server 2000 和SQL Server 2005认证。
赞助商链接