如何为我的触发器选择正确的行

Posted

技术标签:

【中文标题】如何为我的触发器选择正确的行【英文标题】:How may I SELECT the right row for my trigger 【发布时间】:2015-12-03 08:14:16 【问题描述】:

我是存储过程和触发器的新手。在对特定行的LeaveRequest 表执行UPDATE 后,我有以下触发器:

ALTER TRIGGER [dbo].[LeaveRequestTrig]

 ON  [dbo].[LeaveRequest]
   AFTER UPDATE
AS 
BEGIN

    DECLARE @StateId int

SET @StateId = (SELECT LeaveRequest.LeaveRequestStateId FROM LeaveRequest)

IF (@StateId = 2)   
    PRINT 'yes'
ELSE
    PRINT 'no'

END 

但是问题来了,如果我没有与上一个查询相同的参数,我怎么能SELECT 刚刚成为UPDATEd 的行?

假设我的UPDATE 是为user = kade 而在哪里id = 55 我如何在我的触发器中选择同一行?

【问题讨论】:

这可能会有所帮助:msdn.microsoft.com/en-us/library/ms191300.aspx 【参考方案1】:

您可以在触发器内部使用名为 DELETEDINSERTED 的伪表,您可以在那里获取更新的 ID。请注意,一般情况下,一个查询中可能会更新多行,因此您可能会在 DELETEDINSERTED 伪表中获得多行。

【讨论】:

您声明的第二部分确实让我感到困扰,我确实收到一条错误消息,指出它返回多个值。但是我只用特定参数更新了一行,如何使用这两个伪表检索这一特定行?编辑:我忘了更新触发器!好像可以了,谢谢! 打印所有检索到的值并查看它们在inserteddeleted 中的内容,看看发生了什么。此外,对于 UPDATE,deleted inserted 伪表中都会有一条记录 - 一个具有旧值,另一个具有更新值。【参考方案2】:

使用

SET @StateId = (SELECT LeaveRequest.LeaveRequestStateId FROM Inserted)

更多参考Trigger insert。 如果您担心返回多行,请点击显示how to join the psuedotables to get single row的链接

【讨论】:

以上是关于如何为我的触发器选择正确的行的主要内容,如果未能解决你的问题,请参考以下文章

如何为托管对象的关系触发故障

如何为转发域编写正确的 SPF TXT 记录

jQuery DataTables:如何为每个动态添加的行添加行 ID?

如何为SQL Server数据库中的所有表创建触发器

如何为 cron 触发器处理石英夏令时的用户时区?

如何为我的查询中出现的每颗星触发 splunk 警报