WEB开发网
开发学院数据库MSSQL Server 探究 SQL Serverr 的触发器:第二部分 阅读

探究 SQL Serverr 的触发器:第二部分

 2007-11-11 13:06:45 来源:WEB开发网   
核心提示: 通常,当引用一张表的 UPDATE 语句试图去赋值一个计算型的,探究 SQL Serverr 的触发器:第二部分(4),恒等型的或是时间戳型的列时,会产生一个错误,在这种情况下,在执行一个对ExtendedPrice列进行修改的UPDATE语句时,因为这些列的值必须是由sql server(WINDOWS平台上强大的

通常,当引用一张表的 UPDATE 语句试图去赋值一个计算型的,恒等型的或是时间戳型的列时,会产生一个错误,因为这些列的值必须是由sql server(WINDOWS平台上强大的数据库平台)来决定的。这些列必须被包含在UPDATE 语句中以便能满足列不能为空的要求。但是,如果 UPDATE 语句用 INSTEAD OF 触发器引用一个视图,定义在触发器中的逻辑可以旁路掉这些列来避免错误的发生。为了达到这个目的,触发器决不能尝试去更新基表中相应列的值(让它们远离 UPDATE 语句的 SET 从句)。当某一条被处理的记录来自被插入的表时,计算型的,恒等型的或是时间戳型的列可以用一个虚假值以满足不为空值的要求,这时,INSTEAD OF 触发器将忽略这些值,正确的值由 sql server(WINDOWS平台上强大的数据库平台) 设置。

更新分开的列

INSTEAD OF 触发器也很普遍地用于更新基表中计算型的列。例如,假设存在有如下这样一个叫 vwOrdersOrderDetailsProducts 的视图:

CREATE VIEW vwOrdersOrderDetailsProducts
AS
  SELECT  o.OrderID,
    o.OrderDate,
    od.UnitPrice * od.Quantity AS ExtendedPrice,
    p.ProductID,
    p.ProductName
  FROM Orders o
    INNER JOIN [Order Details] od ON o.OrderID = od.OrderID
    INNER JOIN Products p ON od.ProductID = p.ProductID
GO

这个视图揭示了一个计算型的列叫ExtendedPrice,这个列不能被直接被更新,因为它不能将其自己变为表中独立的一列。虽然你可实现这样一个生意规则,在这个规则中ExtendedPrice通过这个视图来修改,Quantity列不应修改,但是UnitPrice可被修改(我知道这条规则有点奇怪,但我可以忍受这点)。可以写一个INSTEAD OF UPDATE触发器来增强这条生意规则,其代码如下所示:

CREATE TRIGGER tr_vwOrdersOrderDetailsProducts_IO_U
  ON vwOrdersOrderDetailsProducts
  INSTEAD OF UPDATE
AS
  UPDATE   [Order Details]
  SET    UnitPrice = i.ExtendedPrice / Quantity
  FROM    inserted i
    INNER JOIN [Order Details] od ON i.OrderID = od.OrderID AND
        i.ProductID = od.ProductID
GO

这些代码揭示了怎样用一个在INSTEAD OF 触发器中的逻辑来代替对一个计算型列的更新。假设一个产品在一张特定的定单表中Quantity为100而ExtendedPrice要更新为200,这时新的UnitPrice值就变为2。在这种情况下,在执行一个对ExtendedPrice列进行修改的UPDATE语句时,最终的结果是UnitPrice被赋为ExtendedPrice除以Quantity的商。下面的代码可以用来测试这种情况:

上一页  1 2 3 4 5 6 7  下一页

Tags:探究 SQL Serverr

编辑录入:coldstar [复制链接] [打 印]
赞助商链接