在MS SQL Server中,我们可能会遇到这样的问题:
在触发器中,需要把新插入记录中的某些字段值作为参数去操作另一些记录。
举例:
建一条消息的同时,追加给每个用户一个未读状态,每个用户都有自己的阅读状态。
A消息表
B用户表
C状态表
我们在为A表追加记录的同时,需要为C表追加与B表用户数一样多的用户阅读状态表。
解决这个问题,我们可以把它放在SQL服务器的触发器中,用行级触发器。需要用到以下知识:
deleted 和 inserted 是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索 deleted 表中的所有值,请使用:
SELECT * FROM deleted
触发器代码:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER TRIGGER [mys]
ON [dbo].[dt_Message] --dt_Message是上面说的A表,在这里,为它指定行级触发
AFTER INSERT
AS
BEGIN
insert dt_MessageIsOpen (UserId,MessageId) select UserId,Inserted.MessageId from aspnet_Users,Inserted
--被插入数据的MessageIsOpen是上面所说的C表,在这里,它被作为触发器触发之后的操作对象
--作为数据源的有Inserted, aspnet_Users两个表,inserted 是逻辑(概念)表,在这里,它把A表中新插入记录中的MessageId作为数据源参数;aspnet_Users是上面提到的B表,它为C表提供UserId。
END