Inserted Deleted为临时表,驻留在内存中
当对某张表建立触发器后,分3种情况讨论
1.插入操作(Insert)
Inserted表有数据,Deleted表无数据
2.删除操作(Delete)
Inserted表无数据,Deleted表有数据
3.更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)
对行记录的判断应该用到Inserted表和Deleted表
ps:对列更新操作的判断的两个函数COLUMNS_UPDATED()
和UPDATE(列名)
UPDATE(列名)
是为了判断单一列是否被INSERT或是UPDATE语句修改过,返回true或false
COLUMNS_UPDATED()
是对多个列是否被INSERT或是UPDATE语句修改的判断,返回的是位掩码,读取的顺序是从左到右,和一般的二进制读取顺序正好相反
eg:
对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。因这个位掩码代表2次幂,第一位表示1,第二位表示2,第三位表示4,第四位表示8,第五位表示16(是的,这是和正常二进制数相反的顺序);因此只表示UnitPrice和Quantity字段被修改位掩码的值为00110,这个值为12(4+8)。
ps,这个Order_Details表共有5个字段,Quantity和UnitPrice分别在第三位和第四位