私たちのデータベースでは、ほとんどのテーブルに最後の行または適用された行dbupddate
を示すフィールドがあります。datetime
INSERT
UPDATE
このフィールドに誤った値が含まれないようにするために、トリガー (場合によってAFTER
は 、場合によってはINSTEAD OF
) が存在し、最終的に値が正しく、誰かがそのフィールドに書き込もうとする「手動の」他の値ではないことを確認します。
現在、更新ステートメントを実行しています (実際MERGE
には) OUTPUT
。そのフィールドを含む句が必要です。適切な MS の記事で読んだように、OUTPUT
トリガーは無視されます。
トリガーの後にOUTPUT
値を返す回避策はありますか? dbupddate
情報を描画するために別のクエリを作成したくありません。これらのクエリの間の一瞬で、別のユーザーの 3 番目のクエリがすべてを変更したとは限らないためです。
Larnu の提案に従った結果
いくつかの意味を理解できるようにフィールドのdefault
値を変更することを除いて、提供された例を実行しました。4 つのクエリをそれぞれ実行した後、それぞれのテーブルから選択し、値を比較しました。updatetime
convert(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
場合によっては、デフォルト値は存在しませんが、実際のテーブルとクエリの出力には異なる値があります。これらの値を同じにする方法も、更新の場合に日時で正確に何が起こるかもわかりません。