0

トリガーで遊ぶ; 概念は簡単に聞こえましたが、デバッガーと print ステートメントの両方で証明されているように、挿入テーブルが空である理由に行き詰まりました。

コンテキストは次のとおりです。FlightAudit テーブルをキーで更新したいのですが、Flight テーブルの変更は一時的に禁止されています。「コメント」列の最後にあるキーに区切り文字を詰め込み、それを解析して戻す「ハック」を思い付きました。「更新の代わりに」トリガーの代わりに「更新後」トリガーで必要なことができるかどうかを確認するためのテストを行っていました。コメントを解析してセミコロンの前の元の値に戻し、セミコロンの後のデータを使用して Audit テーブルを更新します。

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 
4

1 に答える 1

1

投稿した直後に、私は問題を見ました。「Flight」という実際のテーブルを「Flight2」というテスト テーブルに複製しました。

理由はわかりませんが、以下の最初の UPDATE ステートメントが INSERTED テーブルが空になった原因のようです。これを 2 番目の更新ステートメントに変更すると、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 
于 2012-07-11T19:01:31.107 に答える