触发器基于表的操作,对表进行增删改时添加触发器。以下sql语句:当对表进行修改操作时,触发器执行,修改表中Inventory的值。(if判断条件-触发器不再执行,必须有出口否则触发器无限执行)
--创建触发器 触发器名称
CREATE TRIGGER [dbo].[tr_Sduept_Inventory_Update]
ON [dbo].[Inventory]
AFTER UPDATE --修改操作的触发器
AS
BEGIN
--修改的触发器
--1 delete 2 insert
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @cInvCode NVARCHAR(60),@iInvSPrice FLOAT,@iInvNCost FLOAT;
--SELECT * FROM Deleted;
SELECT @cInvCode=cInvCode,@iInvSPrice=Inserted.iInvSPrice,@iInvNCost = Inserted.iInvNCost FROM Inserted;
IF (ISNULL(@iInvSPrice,0)<>ISNULL(@iInvNCost,0))
BEGIN
--修改表中字段值
UPDATE Inventory SET iInvSPrice=iInvNCost WHERE cInvCode=@cInvCode;
--将修改前的数据插入日志表中
INSERT INTO Sduept_Inventory_iInvPrice_Log(cInvCode,iInvSPrice,iInvNCost,CreatedOn,CreatedUser)
SELECT Inserted.cInvCode,Inserted.iInvSPrice,Inserted.iInvNCost,getdate(),Inserted.cModifyPerson FROM Inserted
END
END
触发器语句中使用了两种特殊的表:deleted 表和 inserted 表。
Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发器表通常没有相同的行。
Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。
1.插入操作(Insert)
Inserted表有数据,Deleted表无数据
2.删除操作(Delete)
Inserted表无数据,Deleted表有数据
3.更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)