Share via


Birden çok satır veri işlemek için dml Tetikleyicileri oluşturma

dml tetikleyici kodu yazarken, tetiğin ateşlenmesine neden olan deyimi birden çok satır verileri, tek bir satır yerine etkileyen tek bir deyimi olabilir düşünün. Bu ifadeler sık birden çok satır etkilediğinden, update ve delete Tetikleyiciler için bu davranış yaygındır. Davranış, çünkü temel INSERT deyimi yalnızca tek bir satır ekler, INSERT Tetikleyiciler için daha az yaygındır. Ancak, çünkü bir INSERT INTO tarafından ekleme tetikleyicisi ateş (table_name) select deyimi, çok sayıda satır ekleme bir tetikleyicinin çağırma neden.

dml tetikleyici işlevi otomatik olarak bir tablodan Özet değerleri hesaplamak ve sonuçları sürekli tallies için başka depolamak üzere olduğunda multirow konuları özellikle önemlidir.

[!NOT]

Çünkü onlar potansiyel performansı azaltabilir, Tetikleyiciler imleçler kullanma önerilmez. Birden çok satır etkileyen tetikleyici tasarımı için satır kümesi tabanlı mantığı imleçleri yerine kullanın.

Örnekler

dml Tetikleyiciler aşağıdaki örneklerde bir sütunun toplam başka bir tabloda depolamak için tasarlanmış AdventureWorks2012 örnek veritabanı.

A.Bir çalışan bir tek satır eklemek için toplam depolama

dml tetikleyici ilk sürümü çalışır iyi bir tek satır eklemek için bir veri satırı içine yüklendiğinde PurchaseOrderDetailtablosu. dml tetikleyici INSERT deyimi patlar ve yeni satır yüklenen takılı tablo için tetikleyici yürütme süresi. UPDATEDeyimi okuma LineTotalsütun değeri satır ve varolan değeri değeri ekler SubTotalsütununda PurchaseOrderHeadertablosu. WHEREYan tümcesi yapar emin güncelleştirilmiş satır içinde PurchaseOrderDetailtablo maçları PurchaseOrderIDsatır takılı tablosu.

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

B.Çalışan bir çok satırlı ya da tek satır ekleme için toplam depolama

Çok satırlı bir INSERT, dml tetikleyici örnek a düzgün çalışmayabilir; ifade içinde bir update deyimi bir atama ifadesi sağındaki ( SubTotal + LineTotal) tek bir değer, değil bir değerler listesi-ebilmek var olmak. Bu nedenle, tek bir satırda bir değer almak için tetikleyici etkisi olduğunu takılı varolan tablo ve bu değer SubTotaldeğer içinde PurchaseOrderHeaderiçin belirli bir tablo PurchaseOrderIDdeğer. Bu işlem tek bir eğer beklenen etkisi olmayabilir PurchaseOrderIDdeğer oluştu birden fazla kez takılı tablosu.

Doğru güncelleştirmek için PurchaseOrderHeadergerekir tetikleyici tablo, izin için birden çok satır şansını takılı tablosu. Bunu kullanarak yapabilirsiniz SUMtoplamı hesaplayan işlevi LineTotalsatır grubu için eklenen tablo her PurchaseOrderID. SUMİşlevi ilişkili alt sorgu içinde bulunur ( SELECTdeyimi parantez içinde). Bu sorgu için tek bir değer döndüren PurchaseOrderIDde eklenen eşleşen veya ile ilişkili tabloda bir PurchaseOrderIDiçinde PurchaseOrderHeadertablo.

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

Ayrıca, Bu tetikleyici bir tek satır eklemek düzgün olarak çalışır; toplamı LineTotaldeğer sütunu tek bir satır toplamıdır. Ancak, bu ile ilişkili alt sorgu tetik ve INkullanılan işleç WHEREyan tümcesi gerektirir ek işleme dan SQL Server. Bu bir tek satır eklemek için gereksizdir.

C.INSERT türüne göre çalışan bir toplam depolama

Sen-ebilmek değişmek Tetikleyici satır sayısı için en uygun yöntemi kullanın. Örneğin, @@ROWCOUNTfonksiyonu tetikleyici mantığı tek bir multirow ekleme ayırt etmek için kullanılabilir.

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

Ayrıca bkz.

Diğer Kaynaklar

Implementing DML Triggers