Aracılığıyla paylaş


DML Tetikleyicileri MultiRow ile ilgili konular

DML tetikleyicisi için kod yazdığınızda, tetiğin ateşlenmesine neden olan bir deyim yerine, tek bir satır verilerinin birden çok satırı etkileyecek bir tek deyimli olabileceğini dikkate alın.Bu deyimleri genellikle birden çok satır etkilediğinden bu GÜNCELLEŞTIR ve SIL Tetikleyicileri için genel bir davranıştır.Temel bir INSERT deyim çünkü yalnızca tek bir satır INSERT Tetikleyicileri daha az yaygın bir davranıştır.Ancak, bir INSERT tetikleyici harekete çünkü bir INSERT INTO (göre)table_name) deyim, çok sayıda satır ekleme, bir tek bir tetikleyici çağırma neden olabilir.

DML tetikleyicisi işlevini otomatik olarak bir Özet değerleri hesaplamak, multirow konuları özellikle önemlidir tablo ve sonuçlar sürekli tallies için başka saklayın.

Not

Olası performansı azaltabilir, çünkü, Tetikleyicileri imleçleri kullanma önerilmez.Birden çok satırı etkileyecek bir tetikleyicisi tasarlamak için , satır kümesi kümesi tabanlı mantığı, imleçleri yerine kullanın.

Örnekler

DML Tetikleyicileri aşağıdaki örneklerde, sütun toplam çalışan başka bir programda saklamak için tasarlanmış tablo, AdventureWorks Örnek Veritabanı'nı tıklatın.

C.Bir tek satır ekleme için toplam depolama

Veri satırı içine yüklendiğinde, DML tetikleyicisi ilk sürüm için iyi bir tek satır ekleme çalışır PurchaseOrderDetail TABLO. INSERT deyim DML Tetik ateşlendiğinde ve yeni satır yüklenen eklenen tablosu tetikleyici yürütme süresi.The UPDATE deyim reads the LineTotal sütun value for the row and adds that value to the existing value in the SubTotal sütun in the PurchaseOrderHeader tablo. The WHERE yan tümce makes sure that the updated row in the PurchaseOrderDetail tablo matches the PurchaseOrderID of the row in the inserted tablo.

-- Trigger is valid for single-row inserts.
USE AdventureWorks;
GO
CREATE TRIGGER NewPODetail
ON Purchasing.PurchaseOrderDetail
AFTER INSERT AS
   UPDATE PurchaseOrderHeader
   SET SubTotal = SubTotal + LineTotal
   FROM inserted
   WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID ;

b.Multirow ya da tek-satırlı bir ekleme için toplam depolama

Multirow ekleme için DML tetikleyicisi örnekte A doğru şekilde çalışmayabilir; ifade bir atama ifade içinde bir UPDATE ifade (sağaSubTotal + LineTotal) yalnızca tek bir değer değil bir değerler listesi olabilir. Bu nedenle, tek bir satırda bir değer almak için tetikleyici etkisi olduğu eklenen tablo ve bu değeri eklemek için varolan SubTotal bulunan değer PurchaseOrderHeader Belirli bir tablo PurchaseOrderID Değer. Bu işlem, tek bir beklenen etkili olmayabilir PurchaseOrderID değer, birden çok kez oluştu eklenen tablo.

Doğru olarak güncelleştirmek için PurchaseOrderHeader Tablo, tetikleyici temsilciyseniz, birden çok satır için izin vermeniz eklenen tablosudur.Kullanarak bunu yapabilirsiniz SUM Toplam hesaplayan bir işlev LineTotal bir satır grubu için eklenen her tabloPurchaseOrderID. The SUM işlev is included in a bağıntılı alt sorgu (the SELECT deyim in parentheses). Bu alt sorgu her biri için tek bir değer verir PurchaseOrderID içinde eklenen eşleşen veya correlated ile tablosuPurchaseOrderID içinde PurchaseOrderHeader TABLO.

-- Trigger is valid for multirow and single-row inserts.
USE AdventureWorks;
GO
CREATE TRIGGER NewPODetail2
ON Purchasing.PurchaseOrderDetail
AFTER INSERT AS
   UPDATE PurchaseOrderHeader
   SET SubTotal = SubTotal + 
      (SELECT SUM(LineTotal)
      FROM inserted
      WHERE PurchaseOrderHeader.PurchaseOrderID
       = inserted.PurchaseOrderID)
   WHERE PurchaseOrderHeader.PurchaseOrderID IN
      (SELECT PurchaseOrderID FROM inserted);

Bu tetikleyici de doğru tek satırda çalışır ekleme; toplamı LineTotal değer sütun tek bir satır toplamıdır. Ancak, bu tetikleyici bağıntılı alt sorgu ve IN kullanılan işleç WHERE yan tümce, ek bir işlem gerekli SQL Server. Bu, bir tek satır ekleme için gereksizdir.

c.Ekleme türüne göre bir toplam depolama

Tetikleyici, satır sayısı için en iyi yöntem kullanmak üzere değiştirebilirsiniz.Örneğin, @@ROWCOUNT Tetikleyici mantığı tek bir multirow ekleme arasında ayrım yapmalarını işlev kullanılabilir.

-- Trigger valid for multirow and single row inserts
-- and optimal for single row inserts.
USE AdventureWorks;
GO
CREATE TRIGGER NewPODetail3
ON Purchasing.PurchaseOrderDetail
FOR INSERT AS
IF @@ROWCOUNT = 1
BEGIN
   UPDATE PurchaseOrderHeader
   SET SubTotal = SubTotal + LineTotal
   FROM inserted
   WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID

END
ELSE
BEGIN
      UPDATE PurchaseOrderHeader
   SET SubTotal = SubTotal + 
      (SELECT SUM(LineTotal)
      FROM inserted
      WHERE PurchaseOrderHeader.PurchaseOrderID
       = inserted.PurchaseOrderID)
   WHERE PurchaseOrderHeader.PurchaseOrderID IN
      (SELECT PurchaseOrderID FROM inserted)
END;

See Also

Concepts