sql 触发器

触发器基于表的操作,对表进行增删改时添加触发器。以下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表有数据(旧数据)

你可能感兴趣的:(SQL)