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