5

私たちのデータベースでは、ほとんどのテーブルに最後の行または適用された行dbupddateを示すフィールドがあります。datetimeINSERTUPDATE

このフィールドに誤った値が含まれないようにするために、トリガー (場合によってAFTERは 、場合によってはINSTEAD OF) が存在し、最終的に値が正しく、誰かがそのフィールドに書き込もうとする「手動の」他の値ではないことを確認します。

現在、更新ステートメントを実行しています (実際MERGEには) OUTPUT。そのフィールドを含む句が必要です。適切な MS の記事で読んだように、OUTPUTトリガーは無視されます。

トリガーの後にOUTPUT値を返す回避策はありますか? dbupddate情報を描画するために別のクエリを作成したくありません。これらのクエリの間の一瞬で、別のユーザーの 3 番目のクエリがすべてを変更したとは限らないためです。


Larnu の提案に従った結果

いくつかの意味を理解できるようにフィールドのdefault値を変更することを除いて、提供された例を実行しました。4 つのクエリをそれぞれ実行した後、それぞれのテーブルから選択し、値を比較しました。updatetimeconvert(datetime2,'1900-01-01')updatetime

INSERT INTO dbo.Sample1 (Someint)
OUTPUT inserted.*
INTO @inserted
SELECT 1;

SELECT 'Sample1 INSERT',*
FROM @inserted; -- 1900-01-01 00:00:00.000000
select * from Sample1  -- 2018-11-05 13:12:13.141580

ここでの出力はトリガーを無視し、トリガーが有効になる前に挿入されたデフォルト値を返すと思いますafter

DECLARE @inserted table (ID int, Someint int, updatedtime datetime2(6))
INSERT INTO dbo.Sample2 (Someint)
OUTPUT inserted.*
INTO @inserted
SELECT 1;

SELECT 'Sample2 INSERT',* --1900-01-01 00:00:00.000000
FROM @inserted;
select * from Sample2 --2018-11-05 13:12:35.580190

同じ。今、クレイジーな部分が来ます。挿入された日付と削除された日付の両方を描きました。

DECLARE @updated table (ID int, Someint int, ins_updatedtime datetime2(6),del_updatedtime datetime2(6))
UPDATE dbo.Sample1 
SET Someint = 2
OUTPUT Inserted.*,Deleted.updatetime
INTO @updated;

SELECT 'Sample1 UPDATE',*
FROM @updated;   --Sample1 UPDATE   1   2   2018-11-05 13:30:01.348490  2018-11-05 13:30:01.348490
select * from Sample1  -- 1 2   2018-11-05 13:31:31.851047


DECLARE @updated table (ID int, Someint int, ins_updatedtime datetime2(6),del_updatedtime datetime2(6))
UPDATE dbo.Sample2
SET Someint = 2
OUTPUT Inserted.*,Deleted.updatetime
INTO @updated;

SELECT 'Sample2 UPDATE',* -- Sample2 UPDATE 1   2   2018-11-05 13:30:20.286422  2018-11-05 13:30:20.286422
FROM @updated;
select * from Sample2 --1   2   2018-11-05 13:31:51.679726

したがって、update場合によっては、デフォルト値は存在しませんが、実際のテーブルとクエリの出力には異なる値があります。これらの値を同じにする方法も、更新の場合に日時で正確に何が起こるかもわかりません。

4

1 に答える 1