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

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

 2007-11-11 13:06:45 来源:WEB开发网   
核心提示: UPDATE vwOrdersOrderDetailsProductsSETExtendedPrice = 200WHEREOrderID = 10265ANDProductID = 17检查改变在INSTEADOF和AFTER触发器中都有UPDATE和COLUMNS_UPDATE功能,这二种功能允许由触发器决定哪些
UPDATE  vwOrdersOrderDetailsProducts
SET   ExtendedPrice = 200
WHERE  OrderID = 10265
AND   ProductID = 17

检查改变

在INSTEAD OF和AFTER触发器中都有UPDATE和COLUMNS_UPDATE功能,这二种功能允许由触发器决定哪些字段由触发器的语句来改变。例如,下面的触发器阻止任何对Employees表中的lastname字段进行修改。在这里,UPDATE功能用来决定对哪些对字段的修改可以执行。如果超出发生了改变(而又是不允许修改的)就会产生一个错误。PAISERR OR功能和事务就会回退,回退会撤消所做的任何修改。UPDATE功能都可以在AGTER触发器和INSTEAD OF触发器中工作,而不是在外部工作。

CREATE TRIGGER tr_Employees_U on Employees AFTER UPDATE AS
  IF UPDATE(lastname)
  BEGIN
    RAISERROR (''''cannot change lastname'''', 16, 1)
    ROLLBACK TRAN
    RETURN
  END
GO

UPDATE功能是为了判断单一列是否被INSERT或是UPDATE语句修改过。UPDATE(列)是一个用来检测更新的标准的方法。但是当需要用来他检测多列是否受到INSERT或UPDATE语句的影响时就变得更低效率。而这恰恰是COLUM_UPDATE功能的一个亮点。COLUMN_UPDATE功能返回一个位掩码来判断特定的列是否被修改过。位掩码是包含在被表中被修改的列中的一个比特,目的是为了在表模式中定义这些列。如果一行修改,这比特位的值就为1,否则为0。不像从右到左地读字节的常规方法,位掩码是从左往右读。例如,下面的代码提示了一个在Order Details表中的触发器,这个触发器是为了检测Quantity和UnitPrice二个字段是否被修改过。

CREATE TRIGGER tr_OrderDetails ON [Order Details] AFTER UPDATE
AS
  IF (COLUMNS_UPDATED() = 12)
  BEGIN
    RAISERROR (''''Cannot change both UnitPrice and Quantity at the
          same time'''', 16, 1)
    ROLLBACK TRAN
  END
GO

如果这个字段都被修改了,就会产生一个错误,同时事务也将回滚。就拿Order Details表来说,COLUMN_UPDATED功能返回代表Order Details表中字段的五个字节。只要第三和第四个字段被修改,上面这种情况就会发生,它检测这些位是不是已赋值为1.当第三和第四位都打开的庆,它就如:00110。L因这个位掩码代表2次幂,第一位表示1,第二位表示2,第三位表示4,第四位表示8,第五位表示16(是的,这是和正常二进制数相反的顺序);因此只表示UnitPrice和Quantity字段被修改位掩码的值为00110,这个值为12(4+8)。请注意,这个触发器只有在UnitPrice和Quantity字段被修改才会将事务回滚。如果其他字段修改的话,位掩码就会不一样,因此就不等于整数12了。如果触发器被修改为禁止对这二个字段修改即使对其他字段也禁止,它就可重新编写为如下:

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

Tags:探究 SQL Serverr

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