INSTEAD OF 指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。 在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。 INSTEAD OF触发器不能在WITH CHECK OPTION的可更新视图上定义。如果向指定了WITH CHECK OPTION 选项的可更新视图添加INSTEAD OF 触发器,SQL Server 将产生一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义INSTEAD OF触发器。
{ [DELETE] [,] [INSERT] [,] [UPDATE] } 是指定在表或视图上执行哪些数据修改语句时将xx触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。 对于 INSTEAD OF 触发器,不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。
CREATE TRIGGER [trUpdateMaterielNum] ON [dbo].[uRecord] -- 表明在插入记录之后执行这个触发器 AFTER INSERT AS -- 当前更新的编号 DECLARE @intID int -- 当前更新的数量 DECLARE @intNum int -- 当前模式 DECLARE @intMode int
-- 判断是否有记录录被更新,@@ROWCOUNT是系统函数,返回受上一语句影响的行数。 IF @@ROWCOUNT >0 BEGIN -- 取得当前插入的物品编号和数量,Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。 SELECT @intID=mId,@intNum=rNum,@intMode=rMode FROM Inserted
-- 判断当前模式(0为入库,1为出库)来更新当前物品的数量 IF @intMode = 0 UPDATE uMateriel SET mNum = mNum + @intNum WHERE mId=@intID ELSE UPDATE uMateriel SET mNum = mNum - @intNum WHERE mId=@intID END
uSysLog -------------- lId int lEvent nvarchar(200) lTime datetime DEFAULT GetDate()
CREATE TRIGGER [trDeleteRecord] ON [dbo].[uRecord] -- 表明在插入记录之后执行这个触发器 FOR DELETE AS -- 当前删除的流水号 DECLARE @intID int -- 当前删除的数量 DECLARE @intNum int -- 当前模式 DECLARE @intMode int
-- 判断是否有记录录被更新,@@ROWCOUNT是系统函数,返回受上一语句影响的行数。 IF @@ROWCOUNT >0 BEGIN -- 取得当前删除的行信息,Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。 SELECT @intID=rId,@intNum=rNum,@intMode=rMode FROM Deleted
-- 向日志表中插入一条简单的删除事件日志 INSERT INTO uSysLog (lEvent) VALUES ('用户删除了流水号为:' + CAST(@intID as nvarchar(20) + ',数量:' + CAST(@intNum as nvarchar(20) + ',方向:' + CASE @intMode WHEN 0 THEN '入库' ELSE '出库' END) END