2012-07-11 34 views
0

玩觸發器;這個概念聽起來很容易,但堅持爲什麼我的插入表是空的,調試器和打印語句都證明了這一點。爲什麼「更新後」觸發器的INSERTED表爲空?

上下文是這樣的:我們想用一個鍵更新FlightAudit表,但是我們暫時禁止更改Flight表。我們想出了「黑客」,在「評論」欄末尾加上一個分隔符,然後將其解析出來。我們正在做一個測試,看看我們是否可以在「更新後」觸發器中執行我們想要的操作,而不是「取代更新」觸發器。我們會在分號前將註釋解析回原始值,然後使用分號後的數據更新審計表。

ALTER TRIGGER [dbo].[tr_Flight2_Upd_Comments] ON [dbo].[Flight2] 
AFTER UPDATE 
AS 
BEGIN 

declare @initial_trancount int = @@TRANCOUNT /* this must be at the very top */; 

begin try 
    /* For performance reasons */ 
    SET NOCOUNT ON; 

    DECLARE @Comments varchar(100); 
    DECLARE @Type char(1); 
    DECLARE @FieldsUpdated XML;  
    DECLARE @ColumnsUpdated VARBINARY(100); 
    DECLARE @AircraftChange bit; 
    DECLARE @NumInsertedRowsForDebug int; 

    SELECT Top 1 @Comments = Inserted.Comments FROM inserted 
    SELECT @NumInsertedRowsForDebug = COUNT(*) from inserted 
-- Here is where see this issue, @Comments is null & 
    print 'Comments=' + IsNull(@Comments,'null') 
    print 'NumRows=' + convert(varchar(10),@NumInsertedRowsForDebug) 

    -- Action 
    IF (UPDATE(Comments)) 
      BEGIN 
       Print 'This part works fine' 
       -- logic here removed that sets @NewComments 
       UPDATE Flight 
       SET Comments = @NewComments 
       FROM Inserted, Flight2 
       WHERE Inserted.FlightId = Flight2.FlightID 
      END 
etc... 
END 

測試腳本:發佈後

update flight2 
    set Comments = 'Test22;DL 123420120711SLC;2011-01-01 00:00:00.0000000', 
     ShortCode = 'DL' 
    where FlightId = 'D1448AF1-1F00-41C6-B2F6-2F2EE1BACE07' 
select Comments, ShortCode, * from Flight2 

回答

1

近在咫尺,我看到了這個問題。我們已經將名爲「Flight」的真正表格克隆到名爲「Flight2」的測試表中。

我不知道爲什麼,但下面的第一條UPDATE語句似乎是INSERTED表爲空的原因,因爲當我將其更改爲第二個更新語句時,INSERTED表就像預期的那樣工作。

UPDATE Flight 
       SET Comments = @NewComments 
       FROM Inserted, Flight 
       WHERE Inserted.FlightId = Flight.FlightID 

UPDATE Flight 
       SET Comments = @NewComments 
       FROM Inserted, Flight2 
       WHERE Inserted.FlightId = Flight2.FlightID 
+0

看起來還是越野車,它會爲多行更新失敗,除非它們都具有相同的'@ NewComments' – 2012-07-11 19:05:10

+0

同意,這裏很多車的事情......顯然,所有授權更新是在一個行在時間基礎上。 – NealWalters 2012-07-11 21:16:43

相關問題