如何为我的触发器选择正确的行
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
刚刚成为UPDATE
d 的行?
假设我的UPDATE
是为user = kade
而在哪里id = 55
我如何在我的触发器中选择同一行?
【问题讨论】:
这可能会有所帮助:msdn.microsoft.com/en-us/library/ms191300.aspx 【参考方案1】:您可以在触发器内部使用名为 DELETED
和 INSERTED
的伪表,您可以在那里获取更新的 ID。请注意,一般情况下,一个查询中可能会更新多行,因此您可能会在 DELETED
和 INSERTED
伪表中获得多行。
【讨论】:
您声明的第二部分确实让我感到困扰,我确实收到一条错误消息,指出它返回多个值。但是我只用特定参数更新了一行,如何使用这两个伪表检索这一特定行?编辑:我忘了更新触发器!好像可以了,谢谢! 打印所有检索到的值并查看它们在inserted
和deleted
中的内容,看看发生了什么。此外,对于 UPDATE,deleted
和 inserted
伪表中都会有一条记录 - 一个具有旧值,另一个具有更新值。【参考方案2】:
使用
SET @StateId = (SELECT LeaveRequest.LeaveRequestStateId FROM Inserted)
更多参考Trigger insert。 如果您担心返回多行,请点击显示how to join the psuedotables to get single row的链接
【讨论】:
以上是关于如何为我的触发器选择正确的行的主要内容,如果未能解决你的问题,请参考以下文章