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

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

 2007-11-11 13:06:45 来源:WEB开发网   
核心提示: 例如,如果一个视图将 Customers、Products、orders 和 OrderDteils 等表合并成一个视图,探究 SQL Serverr 的触发器:第二部分(2),并利用视图通过程序在屏幕上来显示所有的数据,更新操作便允许用来代替这个视图,每个 UPDATE语句目的都是为了对其中一个基表中的非关键字段进

例如,如果一个视图将 Customers、Products、orders 和 OrderDteils 等表合并成一个视图,并利用视图通过程序在屏幕上来显示所有的数据。更新操作便允许用来代替这个视图,假如存在一个这个样的视图:它包含 Northwind 数据库中的四个表,并且被命名为vwCustomersOrdersOrderDetailsProducts,它看起来像这样(Figure 1):

Figure 1 连接 Customers 及其 Order Details 的视图
CREATE VIEW vwCustomersOrdersOrderDetailsProducts
AS
  SELECT  c.CustomerID,
    c.CompanyName,
    o.OrderID,
    o.OrderDate,
    od.UnitPrice,
    od.Quantity,
    od.Discount,
    p.ProductID,
    p.ProductName
  FROM Customers c
    INNER JOIN Orders o ON c.CustomerID = o.CustomerID
    INNER JOIN [Order Details] od ON o.OrderID = od.OrderID
    INNER JOIN Products p ON od.ProductID = p.ProductID
GO   

vwCustomersOrdersOrderDetailsProducts 视图连接着四个表,并且每个表都暴露一个取样字段。必须记住的一点是,当你设计一个含有 INSTEAD OF UPDATE 的触发器时,将每个表的主关键字段包含在SELECT语句中是很有益的做法。即使这些字段在应用程序不会用到,它们也以在 INSTEAD OF 触发器中用来定位将要被修改的行,然后对基表作相应的修改。假设你打算允许更新该视图以便按非关键字过滤基表。更新代码应该写在 INSTEAD OF UPDATE 触发器中,让触发器去更新 Customers 表中的 CompnayName 列,Orders 表中的 OrderDate 列,Order Details 表的 UnitPrice 和 Quantity 列以及在 Products 表中的 ProductName 列。在这种情况下,使用 AFTER 触发器就不适合了,而 INSTEAD OF 触发器则是一个很好的选择,参见 Figure 2:

Figure 2 用 INSTEAD OF 触发器更新视图
CREATE TRIGGER tr_vwCustomersOrdersOrderDetailsProducts_IO_U
  ON vwCustomersOrdersOrderDetailsProducts
  INSTEAD OF UPDATE
AS
  — 更新 Customers
  UPDATE   Customers
  SET  CompanyName = i.CompanyName
  FROM  inserted i
    INNER JOIN Customers c ON i.CustomerID = c.CustomerID
  — 更新 Orders
  UPDATE   Orders
  SET  OrderDate = i.OrderDate
  FROM  inserted i
    INNER JOIN Orders o ON i.OrderID = o.OrderID
  — 更新 Order Details
  UPDATE   [Order Details]
  SET  UnitPrice = i.UnitPrice,
    Quantity = i.Quantity
  FROM  inserted i
    INNER JOIN [Order Details] od ON i.OrderID = od.OrderID AND
      i.ProductID = od.ProductID
  — 更新 Products
  UPDATE   Products
  SET  ProductName = i.ProductName
  FROM  inserted i
    INNER JOIN Products p ON i.ProductID = p.ProductID
GO   

注意在 Figure 2 中的 INSTEAD OF UPDATE 触发器包含了四个 UPDATE 语句。每个 UPDATE语句目的都是为了对其中一个基表中的非关键字段进行修改。在 UPDATE 语句中包含了每个表中的关键字段对应于视图中的字段。这样就允许 UPDATE 语句在相应的表中定位对应的列并只对这些列作修改。下面的 UPDATE 语句将对 INSTEAD OF 触发器进行测试:

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

Tags:探究 SQL Serverr

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