Neden bir UPDATE INSTEAD OFDATE tetikleyicisi olan bir tablo karşı bir UPDATE kümelenmiş bir dizin ekleme yanı sıra kümelenmiş bir dizin güncelleştirmesi yapıyor gibi görünüyor?


10

Çok basit bir örnekle başlayacağım: her ikisi de aynı şemaya sahip, PK üzerinde kümelenmiş, ancak bir INSTEAD OF UPDATEtetikleyici olan iki tablo :

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

Standart tablo karşısında bir güncelleştirme için sorgu planını görüntülersem, beklenen kümelenmiş dizin güncelleştirmesini alıyorum:

UPDATE Standard SET
    V = 1
    WHERE PK = '1E58B555-B073-471E-B576-4B09C8E18976'

resim açıklamasını buraya girin

Ancak tetikleyici ile tabloya benzer bir güncelleştirme yaparsanız, kümelenmiş bir dizin ekleme yanı sıra kümelenmiş dizin güncelleştirmesi gibi görünüyor olsun:

UPDATE InsteadOf SET
    V = 1
    WHERE PK = '1E58B555-B073-471E-B576-4B09C8E18976'

resim açıklamasını buraya girin

Bu neden? Daha sonra bu sorgu planında (sorgu # 4) beklediğim kümelenmiş dizin güncelleştirmesini görebiliyorum, ancak neden bu # 1 numaralı sorguyu ek bilgi alıyorum?

Yanıtlar:


10

Bir INSTEAD OFtetikleyici saklar gizli çalışma masası * daki etkilenecektir satırların bir kopyası. Bu, gördüğünüz Kümelenmiş Dizin Eklentisidir. Tetikleyici gövde bu çalışma tablosundan * okur ve tetikleyicideki veri değişiklikleri 'normal' operatörünü kullanır (örnekte Kümelenmiş Dizin Güncellemesi).


* Sorgu işlemcisi, yürütme planının kullanıcı tarafından görülebilir formunu oluştururken çalışma tablosunu dahili olarak yeniden adlandırır. Ona yazarken, hedef temel tablo olarak yeniden adlandırılır, okurken, insanların bir tetikleyicide görmeyi beklediği kadar insertedveya deleteddaha az olarak yeniden adlandırılır .

Daha fazla ayrıntı için INSTEAD OF Tetikleyicileri hakkında ilginç şeyler makaleme bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.