トリガーで遊ぶ; 概念は簡単に聞こえましたが、デバッガーと 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