Aracılığıyla paylaş


Eklenen ve silinen tabloları kullanarak

İki özel tablo DML tetikleyicisi deyimleri kullanın: the deleted table and the inserted tables.SQL Server automatically creates and manages these tables.Bazı veri değişiklikleri ve çok etkilerini test etmek için bu geçici, bellekte yerleşik tabloları kullanabilirsiniz küme koşulları DML tetikleyicisi eylemleri.Doğrudan tablolardaki verileri değiştirmek veya gerçekleştirmek veri tanımlama dili create INDEX gibi tablolarda (ddl) işlemlerini.

dml tetikleyiciler, inserted ve deleted Tablolar öncelikle aşağıdakileri gerçekleştirmek için kullanılır:

  • Tablolar arasında başvuru bütünlük genişletir.

  • Eklemek veya bir görünümü temel temel tablolardaki verileri güncelleştirmeye.

  • Hatalarını sınama ve hata üzerinde temel eylem gerçekleştirin.

  • Önce ve sonra bir veri değişikliği tablo durumu arasındaki farkı bulmak ve bu fark üzerinde temel alan eylemler gerçekleştirin.

The deleted table stores copies of the affected rows during DELETE and UPDATE statements.Tetikleyicisinden silinen bir delete veya update deyim yürütme sırasında satırların tablo için transfer edilen ve deleted tablo.The deleted table and the trigger table ordinarily have no rows in common.

The inserted table stores copies of the affected rows during INSERT and UPDATE statements.Bir INSERT veya update işlemi sırasında hem de yeni bir satır eklenir inserted Tablo ve tetikleyici tablo.Satır inserted tablo olan kopyalarını yeni satır tetikleyici tablo.

Güncelleştirme işlemi bir ekleme işleminin ardından delete işlemi benzer; eski satır kopyalanır deleted ilk tablo ve sonra yeni satır tetikleyici tablo ve sistemi kopyalanır inserted tablosu.

Zaman, küme tetikleyen koşullar, kullanın inserted ve deleted tabloları uygun eylem, harekete tetikleyici.Başvuran rağmen deleted Tablo INSERT sınarken veya inserted Tablo delete sınama yaparken neden herhangi bir hata, bu tetikleyici tabloları test et içeren tüm satırları bu durumda.

Not

Tetikleyici eylemleri bir veri değişikliği efektleri satır sayısına bağlı ise, (deyim üzerinde temel alan bir INSERT, delete veya update) multirow veri değişiklikleri için testler (@@ rowcount incelenmesi) kullanın ve uygun eylemleri.

SQL Server 2008izin vermez text, ntext, veya image sütun başvuruları inserted ve deleted tablolar için sonra tetikler.Ancak, bu veri türleri yalnızca geriye dönük uyumluluk amacıyla dahil edilir.Tercih edilen büyük veri depolama kullanmaktır varchar(max), nvarchar(max), ve varbinary(max) veri türü.SONRA ve bunun yerine of tetikler destek varchar(max), nvarchar(max), ve varbinary(max) verileri inserted ve deleted tablolar.Daha fazla bilgi için bkz: CREATE TRIGGER (Transact-SQL).

Örnek olarak kullanarak bir tetikleyici eklenen tablosunda iş kuralları zorlamak için

Denetim kısıtlamalarını yalnızca sütun düzey veya tablo düzey kısıtlaması tanımlı sütunları başvuruda bulunabilir çünkü herhangi arası kısıtlamalar tablo (Bu durum, iş kurallarını) tetikleyiciler olarak tanımlanmalıdır.

Aşağıdaki örnek, DML tetikleyicisi oluşturur.Yeni bir satınalma siparişi eklemek için girişimi yapıldığında, satıcı iyi için kredi notu emin olmak için bu tetikleyici bakar PurchaseOrderHeader tablo.Yalnızca eklenmiş, satınalma siparişine karşılık gelen satıcı kredi derecesi elde etmek için Vendor Tablo başvurulan ve gerekir ile katılan inserted tablosu.Kredi notu çok düşük olduğunu, bir ileti görüntülenir ve ekleme yok yürütmek.

Not

Birden çok satır güncelleştirme dml sonra Tetikleyiciler örnekleri için bkz: dml Tetikleyiciler için MultiRow düşünceleri.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL
   DROP TRIGGER Purchasing.LowCredit;
GO
-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader table
-- when the credit rating of the specified vendor is set to 5 (below average).

CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
DECLARE @creditrating tinyint, @vendorid int;
IF EXISTS (SELECT *
           FROM Purchasing.PurchaseOrderHeader p 
           JOIN inserted AS i 
           ON p.PurchaseOrderID = i.PurchaseOrderID 
           JOIN Purchasing.Vendor AS v 
           ON v.BusinessEntityID = p.VendorID
           WHERE v.CreditRating = 5
          )
BEGIN
RAISERROR ('This vendor''s credit rating is too low to accept new purchase orders.', 16, 1);
ROLLBACK TRANSACTION;
RETURN 
END;

GO
-- This statement attempts to insert a row into the PurchaseOrderHeader table
-- for a vendor that has a below average credit rating.
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back.

INSERT INTO Purchasing.PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,
VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)
VALUES(
2
,3
,261    
,1652   
,4  
,GETDATE()
,GETDATE()
,44594.55   
,3567.564   
,1114.8638);
GO

INSTEAD OF tetikleyicileri eklenen ve silinen tabloları kullanarak

The inserted and deleted tables passed to INSTEAD OF triggers defined on tables follow the same rules as the inserted and deleted tables passed to AFTER triggers.Biçimi, inserted ve deleted Tablo aynıdır INSTEAD of tetikleyici tanımlanan tablo biçimi.Her bir sütun inserted ve deleted tabloları eşleştirir doğrudan için bir sütun temel tablo.

Tablo bir INSTEAD of tetikleyicisi olması gibi ne zaman bir INSTEAD of tetikleyicisi ile bir tabloya başvuran bir INSERT veya update deyim sütun değerlerini sağlamanız gerekir ilgili aşağıdaki kurallar aynıdır:

  • İçin hesaplanan değerleri belirtilemez sütun veya sütunları içeren bir timestamp veri türü.

  • Değerleri belirtilemez bir kimlik özellik içeren sütunlar için IDENTITY_INSERT on ait olmadığı sürece tablo.INSERT deyimleri IDENTITY_INSERT on olarak ayarlandığında, bir değer sağlamanız gerekir.

  • INSERT deyimleri gerekir tedarik tüm değerler varsayılan kısıtlamalar sahip sütunları not null.

  • Tüm sütunları hesaplanmış, kimlik dışında için ya da timestamp sütun, değerleri, boş değerlere izin verir her sütun için isteğe bağlı veya herhangi not null sütun olan bir varsayılan tanım.

Bir INSERT, update veya delete deyim bir INSTEAD of tetikleyicisi olan bir görünümde başvurduğunda Veritabanı Altyapısı çağıran tetikleyici, ayırdığınız herhangi bir doğrudan eylem karşı hiçbir tablo.Tetikleyici içinde sunulan bilgileri kullanmanız gerekir inserted ve deleted bile, temel tablolarda istenen eylem gerçekleştirmek için gereken tüm deyimleri oluşturmak için tablo biçimi bilgileri, inserted ve deleted yerleşik Görünüm tabloları temel tablolar verinin biçimi farklıdır

Biçimi, inserted ve deleted bir görünüm üzerinde tanımlı bir INSTEAD of tetikleyicisi geçirilen tabloları seç Seç listesinde eşleşen deyim tanımlı görünüm.Örneğin:

USE AdventureWorks2008R2;
GO
CREATE VIEW dbo.EmployeeNames (BusinessEntityID, LName, FName)
AS
SELECT e.BusinessEntityID, p.LastName, p.FirstName
FROM HumanResources.Employee AS e 
JOIN Person.Person AS p
ON e.BusinessEntityID = p.BusinessEntityID;

sonuç küme İçin bu görünümün üç sütun vardır: bir int sütun ve iki nvarchar sütunlar.The inserted and deleted tables passed to an INSTEAD OF trigger defined on the view also have an int column named BusinessEntityID, an nvarchar column named LName, and an nvarchar column named FName.

Bir görünümü seçim listesi de doğrudan tek bir temel tablo sütun eşleme ifadeler içerebilir.Bazı sabit veya işlev çağırma gibi ifadeleri görüntülemek için tüm sütunları başvuruda bulunabilir ve göz ardı edilebilir.Karmaşık ifadeler birden çok sütun başvurusu henüz inserted ve deleted tablolara sahip yalnızca bir değer için eklenen her satır.Oldukları aynı sorunları görünümünde basit ifadeler için uygulanacak bir hesaplanan sütun , karmaşık bir ifade vardır.Bu tür ifadeler görünümünde bir INSTEAD of tetikleyicisi işlemesi gerekir.Daha fazla bilgi için bkz: İfadeler ve hesaplanan sütunları Tetikleyicileri INSTEAD OF.

Ayrıca bkz.

Kavramlar