2013-10-21 21 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

此外,我現在無法測試(這就是爲什麼我發佈的評論,而不是答案),但我相當肯定,這將導致僵局。插入的行將因原始插入而被鎖定。嘗試更新鎖定的記錄將導致無法解析的鎖鏈並失敗,從而將所有內容都回滾。 –

相關問題