Eklenen ve silinen tabloları kullanın

dml tetikleyici deyimleri kullanmak iki özel tablolar: deletedtablo ve insertedtabloları. SQL Serverotomatik olarak oluşturur ve bu tabloları yönetir. Belirli veri değişiklikleri sınama ve dml tetikleyici eylemler için koşullar bu geçici, bellekte yerleşik tabloları kullanabilirsiniz. Doğrudan tablolardaki verileri değiştirmek veya create INDEX gibi tablolar veri tanım dili (ddl) işlemlerini gerçekleştirin.

dml Tetikleyiciler, insertedve deletedtablolar öncelikle aşağıdakileri gerçekleştirmek için kullanılır:

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

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

  • Hatalar için sınama ve hata dayalı eylemi.

  • Önce ve sonra bir veri değişikliği tablo devlet arasındaki farkı bulmak ve bu fark temel eylemleri.

deletedTablo, delete ve update deyimleri sırasında etkilenen satırların kopyalarını depolar. delete veya update deyimi yürütme sırasında satır tetikleyici tablo silinir ve transfer deletedtablosu. deletedTablo ve tetikleyici tablo normalde var hiçbir satır ortak.

insertedTablo Ekle ve GÜNCELLEŞTIR deyimleri sırasında etkilenen satırların kopyalarını depolar. Bir INSERT veya update işlemi sırasında hem de yeni satırlar eklenir insertedtablo ve tetikleyici tablo. Satırları insertedTablo kopya tetikleyici tablosunda yeni bir satır vardır.

Bir güncelleştirme hareket ekleme işlemi tarafından takip silme işlemi benzer; eski satırların kopyalanır ve deletedilk tablo ve sonra yeni satır tetikleyici tablo ve sistemi kopyalanır insertedtablosu.

Tetikleyici koşullarının ayarladığınız zaman, insertedve deletedtablolar için uygun tetikleyici harekete eylemi. Başvuran, ancak deletedTablo INSERT sınarken veya inserteddelete sınarken tablosu hataları neden olmaz, Bu tetikleyici tabloları test et bu durumlarda tüm satırları içermeyen.

[!NOT]

Tetikleyici eylemleri satır bir veri değişikliği etkileri sayısına bağlıdır, (INSERT, delete veya update bir select deyimi üzerinde tabanlı) multirow veri değişiklikleri için testler (@@ rowcount incelenmesi gibi) kullanın ve uygun eylemleri.

SQL Server 2012izin vermez text, ntext, ya imagesütun başvuruları insertedve deletedsonra Tetikleyiciler tablolar için. Ancak, bu veri türleri yalnızca geriye dönük uyumluluk amacıyla alınır. Tercih edilen saklama için büyük veri kullanmaktır varchar(max), nvarchar(max), ve varbinary(max)veri türlerini. SONRA ve yerine of tetikleyen destek varchar(max), nvarchar(max), ve varbinary(max)verileri insertedve deletedtabloları. Daha fazla bilgi için, bkz. CREATE TRIGGER (Transact-SQL).

Örneğin, kullanarak bir tetikleyici eklenmiş bir tabloya iş kurallarını uygulamak için

CHECK kısıtlamaları yalnızca sütun düzeyi veya tablo düzeyi kısıtlamanın tanımlandığı sütunlara başvurabileceği için, tablolar arası tüm kısıtlamalar (bu durumda, iş kuralları) tetikleyici olarak tanımlanmalıdır.

Aşağıdaki örnek bir DML tetikleyicisi oluşturmaktadır. Bu tetikleyici içine yeni bir satınalma siparişi eklemek girişimi yapıldığında için satıcı iyi kredi derecelendirme denetler PurchaseOrderHeadertablosu. Sadece eklenmiş, satınalma siparişine karşılık gelen satıcı kredi derecelendirmesi elde etmek için Vendortablo başvurulan ve katıldı insertedtablosu. Kredi notu çok düşükse, bir ileti gösterilir ve ekleme işlemi çalışmaz. Bu örnek için multirow veri değişiklikleri izin vermediğini unutmayın. Daha fazla bilgi için, bkz. Birden çok satır veri işlemek için dml Tetikleyicileri oluşturma.

USE AdventureWorks2012;
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
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 ('A 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

inserted Ve deletedtablolar üzerinde tanımlı Tetikleyiciler yerine geçirilen tabloları aynı kuralları takip insertedve deletedtablolar için Tetikleyiciler sonra geçti. Biçimi insertedve deletedtablolar INSTEAD of tetikleyici tanımlanan tablo biçimi ile aynı şeydir. Her sütun insertedve deleteddoğrudan temel tablo sütun eşlemeleri tabloları.

Sanki bir INSTEAD of tetikleyici tablo yoktu ne zaman bir INSTEAD of tetikleyicisi ile bir tabloya başvuran bir INSERT veya update deyimi sütunlar için değerleri sağlaması gereken ilgili aşağıdaki kuralları aynıdır:

  • İçin hesaplanan değerleri belirtilen sütun veya sütunları ile bir timestampveri türü.

  • Identıty_ınsert on bu tabloda değilse bir KIMLIK özelliği içeren sütunlar için değerleri belirtilemez. INSERT deyimleri ıdentıty_ınsert on olarak ayarlandığında, bir değer sağlamalısınız.

  • INSERT deyimleri sağlamanız gerekir tüm değerlerini not null default kısıtlamaları olmayan sütunlar.

  • Tüm sütunları hesaplanmış, kimlik, hariç için veya timestampsütun değerleri boş değerlere izin veren herhangi bir sütun için isteğe bağlı ya da herhangi bir not null default tanımı sütun.

Bir INSERT, update veya delete deyimi bir INSTEAD of tetikleyici içeren bir görünümü başvurduğunda Veritabanı Altyapısıherhangi bir doğrudan eyleme karşı herhangi bir tablonun yerine tetikleyici çağrısı. Tetikleyici içinde sunulan bilgileri kullanmanız gerekir insertedve deletedbile, temel tablolarda istenen eylemi gerçekleştirmek için gereken tüm deyimleri oluşturmak için tabloları bilgi biçimi insertedve deletedGörünümü temel tablolardaki verileri biçimi farklıdır için oluşturulan tablolar.

Biçimi insertedve deletedbir görünüm tanımlı INSTEAD of tetikleyici geçirilen tabloları eşleştirir görünüm için tanımlanan select deyiminin seçim listesi. Örneğin:

USE AdventureWorks2012;
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ümesi için üç sütun bu görünüme sahiptir: bir intsütun ve iki nvarcharsütun. insertedVe deletedgörünüm üzerinde tanımlı bir INSTEAD of tetikleyicisi geçirilen tabloları da var. bir intsütun adlı BusinessEntityID, bir nvarcharadlı sütun LNameve bir nvarcharadlı sütun FName.

Bir görünüm seç listesinde de doğrudan tek bir temel tablo sütun eşlemeyin ifadeler içerebilir. Bazı görüntüleme sabit veya işlev çağırma gibi deyimler, tüm sütunları başvuru değil ve göz ardı edilemez. Karmaşık ifadeler başvuru birden çok sütuna henüz insertedve deletedtablolar var her eklenen satır için tek bir değer. Karmaşık ifade bir hesaplanan sütun başvuruyorsa aynı sorunları basit ifadeler bir görünüm uygulayın. INSTEAD of tetikleyici görünümünde bu tür ifadeler işlemesi gerekir.