Tôi sẽ bắt đầu với một ví dụ rất đơn giản: hai bảng, cả hai bảng có cùng một lược đồ, được nhóm trên PK, nhưng một trong số đó có một trình INSTEAD OF UPDATE
kích hoạt:
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
Nếu tôi xem kế hoạch truy vấn cho một bản cập nhật so với bảng tiêu chuẩn, tôi sẽ nhận được bản cập nhật chỉ mục được mong đợi:
UPDATE Standard SET
V = 1
WHERE PK = '1E58B555-B073-471E-B576-4B09C8E18976'
Tuy nhiên, nếu tôi thực hiện một bản cập nhật tương tự với bảng với trình kích hoạt, tôi sẽ nhận được thứ dường như là một chỉ mục chèn cụm, cũng như cập nhật chỉ mục được nhóm:
UPDATE InsteadOf SET
V = 1
WHERE PK = '1E58B555-B073-471E-B576-4B09C8E18976'
Tại sao lại thế này? Tôi có thể thấy cập nhật chỉ mục được nhóm mà tôi mong đợi sau này trong kế hoạch truy vấn này (truy vấn số 4), nhưng tại sao tôi lại có thêm phần bổ sung này tại truy vấn số 1?