मैं एक बहुत ही सरल उदाहरण के साथ शुरू करूँगा: दो टेबल, दोनों एक ही स्कीमा के साथ, PK पर क्लस्टर किए गए, लेकिन जिनमें से एक में एक INSTEAD OF UPDATE
ट्रिगर है:
CREATE TABLE Standard
(
PK UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED,
V INT NOT NULL
)
GO
CREATE TABLE InsteadOf
(
PK UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED,
V INT NOT NULL
)
GO
INSERT Standard (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0)
INSERT InsteadOf (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0)
GO
CREATE TRIGGER TR_InsteadOf_Update ON InsteadOf INSTEAD OF UPDATE
AS
BEGIN
DECLARE @PK UNIQUEIDENTIFIER
DECLARE @V INT
DECLARE @cursor CURSOR
SET @cursor = CURSOR FOR SELECT PK, V FROM Inserted
OPEN @cursor
FETCH NEXT FROM @cursor INTO @PK, @V
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE InsteadOf SET
V = @V
WHERE PK = @PK
FETCH NEXT FROM @cursor INTO @PK, @V
END
CLOSE @cursor
DEALLOCATE @cursor
END
GO
यदि मैं मानक तालिका के खिलाफ अद्यतन के लिए क्वेरी योजना देखता हूं, तो मुझे अपेक्षित क्लस्टर इंडेक्स अपडेट प्राप्त होता है:
UPDATE Standard SET
V = 1
WHERE PK = '1E58B555-B073-471E-B576-4B09C8E18976'
हालाँकि अगर मैं ट्रिगर के साथ तालिका के खिलाफ एक समान अपडेट करता हूं, तो मुझे वह मिलता है जो एक क्लस्टर इंडेक्स इंसर्ट के साथ-साथ क्लस्टर इंडेक्स अपडेट के रूप में दिखता है:
UPDATE InsteadOf SET
V = 1
WHERE PK = '1E58B555-B073-471E-B576-4B09C8E18976'
ऐसा क्यों है? मैं इस क्वेरी प्लान (क्वेरी # 4) में बाद में अपेक्षित अनुक्रमणिका अद्यतन देख सकता हूं, लेकिन मुझे # 1 पर यह अतिरिक्त प्रविष्टि क्यों मिलती है?