2

今日、インデックスを定義せずにテーブルの列を更新すると、従来の削除\挿入ではなく「インプレース更新」が発生することを著者が証明した素晴らしい投稿を見ました。

Updateこれを考慮して、テーブルにトリガーを作成し、INSERTED魔法のテーブルにアクセスしようとする小さなテストを実行します。ここにキャッチがあります。

マジック テーブルにアクセスできますINSERTED。インプレース アップデートが従来の Delete\Insert を使用していない場合、誰か説明してもらえますか? なぜ魔法のテーブルにアクセスできるのですか?

これらは、このことを証明するための私の SQL ステートメントです。

メインテーブル:

CREATE TABLE TestingUpdate1 (
  ID INT IDENTITY,
  SomeString CHAR(50)
)

INSERT INTO TestingUpdate1 (SomeString)
VALUES
('One'),('Two'),('Three'),('Four'),('Five'),('Six'),('Seven'),('Eight'),('Nine')

CHECKPOINT -- truncate the log, DB is in simple recovery.

UPDATE TestingUpdate1
SET SomeString = 'NotFour'
WHERE ID = 4 -- one row

SELECT Operation, Context, AllocUnitName, [Transaction Name], Description FROM fn_dblog(NULL, NULL) AS TranLog

2 番目のテーブル:

CREATE TABLE TestingUpdate4 (
  ID INT IDENTITY,
  SomeString CHAR(50)
)

INSERT INTO TestingUpdate4 (SomeString)
VALUES
('One'),('Two'),('Three'),('Four'),('Five'),('Six'),('Seven'),('Eight'),('Nine')

引き金 :

CREATE TRIGGER ViewCustomerTrigger ON TestingUpdate1
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ON

UPDATE TestingUpdate4 
SET SomeString = i.SomeString
FROM INSERTED i
END
GO

select * from TestingUpdate4
select * from TestingUpdate1

前もって感謝します

4

1 に答える 1

6

更新トリガーのテーブルINSERTEDとテーブルは、更新された行の前後の論理DELETEDバージョンを常に示します。

それがインプレース更新または挿入/削除として物理的に実装されるかどうかは、実行計画に依存し、これらのテーブルの内容とは無関係です。

于 2013-05-11T08:37:03.493 に答える