2013-10-21 23 views
0

我有一个简单的触发器设置,用于在UnitAGA表中插入记录时将记录插入RentJournal表中。使用触发器在另一个表中插入记录,并将该ID写回原始记录..?

RentJournal表的主键ID列名为RentJournalID,它是自动递增的。 UnitAGA表还具有名为RentJournalID的可为空的外键列,该列将每个UnitAGA条目链接到RentJournal表中的相应条目(通过下面的触发器插入)。

问题是,目前这个触发器只是将值插入到RentJournal表中。但是现在我想通过这个触发器获取为每个RentJournal条目分配的ID,并将其写入相应的UnitAGA记录中,其记录首先实际触发了触发器。我该怎么做呢 ?

的触发代码的,现在是这样的:

USE [RentDB] 
GO 

ALTER TRIGGER [RTS].[InsertRentJournalEntry] 
    ON [RTS].[UnitAGA] 
    AFTER INSERT 
AS 
BEGIN 
    INSERT INTO RTS.RentJournal 
    (UnitId, AdjustmentType, EffectiveDate, ReferenceFormNo) 
    SELECT 
    UnitId, 'AGA', EffectiveDate, ReferenceFormNo FROM inserted 
END 

回答

0

看看在INSERT逻辑表中插入可触发:

DML触发器使用的删除和插入逻辑(概念性)表格。它们在结构上与定义触发器的表相似,也就是用户操作在其上执行的表。删除和插入的表格保存用户操作可能更改的行的旧值或新值。例如,若要检索deleted表中的所有值,使用:SELECT * FROM删除 http://technet.microsoft.com/en-us/library/ms189799.aspx

然后使用@@IDENTITY得到您的RentJournal表中标识列的值。

所以,你应该能够做这样的事情:

update INSERTED set RentJournalID = @@IDENTITY 
+0

对不起,忘了你不能更新逻辑表。仍然这应该工作:'更新RTS.UnitAga设置RentJournalId = @@ IDENTITY其中UnitId =(从插入选择UnitUd)' –

+0

@@ IDENTITY因竞争条件问题而臭名昭着,因为它返回范围的最后一个值REGARDLESS。换句话说,您不能保证返回在触发器的事务上下文中插入的值。您将不得不使用SCOPE_IDENTITY。 –

+0

此外,我现在无法测试(这就是为什么我发布的评论,而不是答案),但我相当肯定,这将导致僵局。插入的行将因原始插入而被锁定。尝试更新锁定的记录将导致无法解析的锁链并失败,从而将所有内容都回滚。 –

相关问题