dml Tetikleyiciler için MultiRow düşünceleri
DML tetikleyicisi kodu yazarken tetikleyicisi ateşlenmesine neden olan deyim birden çok yerine tek bir satır veri satırı etkileyen tek bir deyim olabilir düşünün.Bu davranış, birden çok satır Bu ifadeler sık sık etkilediğinden update ve delete Tetikleyiciler için yaygındır.Çünkü temel INSERT deyim yalnızca tek bir satır ekleme Tetikleyicileri için daha az yaygın bir davranıştır.Ancak, çünkü bir INSERT INTO tarafından INSERT tetikleyici harekete (table_name) deyim, çok sayıda satır ekleme neden bir tek tetikleyici çağrısı.
MultiRow konuları DML tetikleyicisi işlev otomatik olarak, bir Özet değerleri hesaplamak için olduğunda özellikle önem tablo ve sürekli tallies için başka sonuçlar depolamak.
Not
Performans potansiyel azaltmak çünkü tetikler imleçler kullanma önerilmez.Birden çok satır etkiler bir tetikleyicisi tasarlamak için satır kümesi tabanlı mantığı imleçleri yerine kullanın.
Örnekler
dml Tetikleyiciler aşağıdaki örneklerde, başka bir sütunun toplamı depolamak için tasarlanmıştır tablo , AdventureWorks2008R2 örnek veritabanı.
A.Bir tek satır ekleme için toplam depolama
DML tetikleyicisi ilk sürüm çalışır iyi bir tek satır ekleme için bir veri satırı içine yüklendiği sırada PurchaseOrderDetail tablo.INSERT deyim DML tetikleyicisi harekete ve yeni satır yüklenen eklenen tablo için tetikleyici yürütme süresi.The UPDATE statement reads the LineTotal column value for the row and adds that value to the existing value in the SubTotal column in the PurchaseOrderHeader table.The WHERE clause makes sure that the updated row in the PurchaseOrderDetail table matches the PurchaseOrderID of the row in the inserted table.
-- Trigger is valid for single-row inserts.
USE AdventureWorks2008R2;
GO
CREATE TRIGGER NewPODetail
ON Purchasing.PurchaseOrderDetail
AFTER INSERT AS
UPDATE PurchaseOrderHeader
SET SubTotal = SubTotal + LineTotal
FROM inserted
WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID ;
B.Bir multirow veya tek satır ekleme için toplam depolama
Multirow ekleme için örnekte a DML tetikleyicisi düzgün çalışmayabilir; bir update deyim içinde bir atama deyiminin sağ deyim (SubTotal + LineTotal) yalnızca tek bir değer değil listesi değerleri. olabilirBu nedenle, tek bir satırda bir değer almak için tetikleyici etkisi, eklenen varolan değeri eklemek ve tablo SubTotal , değer PurchaseOrderHeader özel bir tablo PurchaseOrderID değer.Bu işlem, tek bir beklenen etkili olmayabilir PurchaseOrderID değeri birden fazla oluştu saat , eklenen tablo.
Doğru güncelleştirmek için PurchaseOrderHeader gerekir tetikleyici tablo, izin için birden fazla satırda olasılığını eklenen tablosu.Kullanarak bunu yapabilirsiniz SUM işlev toplam hesaplar LineTotal bir satır grubu için eklenen her biri için tablo PurchaseOrderID.The SUM function is included in a correlated subquery (the SELECT statement in parentheses).Bu alt sorgu her biri için tek bir değer döndürür PurchaseOrderID de eklenen tabloda eşleşen veya ile bağıntılı bir PurchaseOrderID , PurchaseOrderHeader Tablo.
-- Trigger is valid for multirow and single-row inserts.
USE AdventureWorks2008R2;
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 bir tek satır Ekle'de düzgün çalışır; toplamı LineTotal değerini sütun toplamı tek bir satır.Ancak, bu ile bağıntılı alt sorgu tetiklemek ve IN , kullanılan işleç WHERE yan tümce tümce tümce gerektirir ek işlemesini SQL Server.Bu seçenek için bir tek satır ekleme gereksizdir.
C.INSERT türüne göre toplam depolama
Tetikleyici satır sayısını öğrenmek için en iyi yöntem kullanacak şekilde değiştirebilirsiniz.Örneğin, @@ROWCOUNT işlev mantığı tetikleyicinin arasındaki tek bir ayırt etmek için kullanılabilirmultirow bir INSERT.
-- Trigger valid for multirow and single row inserts
-- and optimal for single row inserts.
USE AdventureWorks2008R2;
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;