在编写触发器事件时如何获得当前插入记录的字段值?(MS SQL Server)

时间:2022-03-22 15:03:31

在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