Eklenen ve silinen tabloları kullanma
Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği
DML tetikleyici deyimleri iki özel tablo kullanır: silinen ve eklenen tabloları. SQL Server bu tabloları otomatik olarak oluşturur ve yönetir. Belirli veri değişikliklerinin etkilerini test etmek ve DML tetikleyici eylemleri için koşullar ayarlamak için bu geçici, bellekte yerleşik tabloları kullanabilirsiniz. Tablolardaki verileri doğrudan değiştiremez veya create INDEX gibi tablolarda veri tanım dili (DDL) işlemleri gerçekleştiremezsiniz.
Eklenen ve silinen tabloları anlama
DML tetikleyicilerinde, eklenen ve silinen tablolar öncelikli olarak aşağıdakileri gerçekleştirmek için kullanılır:
Tablolar arasında referans bütünlüğünü genişletin.
Bir görünümün temel alınan temel tablolarına veri ekleme veya güncelleştirme.
Hataları test edin ve hataya göre işlem yapın.
Veri değişikliğinden önce ve sonra tablonun durumu arasındaki farkı bulun ve bu farka göre eylemler gerçekleştirin.
silinen tablosu, delete veya UPDATE deyimiyle değiştirilmeden önce etkilenen satırların kopyalarını tetikleyici tablosunda depolar (tetikleyici tablosu, DML tetikleyicisinin çalıştığı tablodur). DELETE veya UPDATE deyimi yürütülürken, etkilenen satırlar önce tetikleyici tablosundan kopyalanır ve silinen tabloya aktarılır.
Eklenen tablo, INSERT veya UPDATE deyiminden sonraki yeni veya değiştirilmiş satırların kopyalarını depolar. INSERT veya UPDATE deyiminin yürütülmesi sırasında tetikleyici tablosundaki yeni veya değiştirilen satırlar eklenen tabloya kopyalanır. Eklenen tablodaki satırlar tetikleyici tablosundaki yeni veya güncelleştirilmiş satırların kopyalarıdır.
Güncelleştirme işlemi, silme işlemine ve ardından ekleme işlemine benzer. UPDATE deyiminin yürütülmesi sırasında aşağıdaki olay dizisi gerçekleşir:
- Özgün satır tetikleyici tablosundan silinen tabloya kopyalanır.
- Tetikleyici tablosu UPDATE deyimindeki yeni değerlerle güncelleştirilir.
- Tetikleyici tablosundaki güncelleştirilmiş satır, eklenen tabloya kopyalanır.
Bu, güncelleştirmeden önceki satırın içeriğini (silinen tabloda) güncelleştirmeden sonraki yeni satır değerleriyle (eklenen tabloda) karşılaştırmanızı sağlar.
Tetikleyici koşullarını ayarladığınızda, tetikleyiciyi tetikleyen eylem için eklenen ve silinen tabloları uygun şekilde kullanın. BIR INSERT'i test ederken silinen tabloya başvurmak veya DELETE testi sırasında eklenen tabloya başvurmak hataya neden olmasa da, bu tetikleyici test tabloları bu durumlarda herhangi bir satır içermez.
Not
Tetikleyici eylemler veri değişikliğinin etkilediği satır sayısına bağlıysa, çok satırlı veri değişiklikleri (SELECT deyimine göre bir INSERT, DELETE veya UPDATE) için testler (örneğin, @@ROWCOUNT incelemesi) yapın ve uygun eylemleri gerçekleştirin. Daha fazla bilgi için bkz. Birden Çok Veri Satırını İşleyecek DML Tetikleyicileri Oluşturma.
SQL Server, AFTER tetikleyicileri için eklenen ve silinen tablolarda metin, ntextveya resim sütun başvurularına izin vermez. Ancak, bu veri türleri yalnızca geriye dönük uyumluluk amacıyla eklenir. Büyük veriler için tercih edilen depolama alanı, varchar(max), nvarchar(max)ve varbinary(max) veri türlerini kullanmaktır. Hem AFTER hem de INSTEAD OF tetikleyicileri, eklenen ve silinen tablolarda varchar(max), nvarchar(max)ve varbinary(max) verilerini destekler. Daha fazla bilgi için bkz. create TRIGGER (Transact-SQL)
Örnek: İş kurallarını zorunlu kılmak için tetikleyiciye eklenen tabloyu kullanma
CHECK kısıtlamaları yalnızca sütun düzeyi veya tablo düzeyi kısıtlamasının tanımlandığı sütunlara başvurabildiğinden, tablolar arası kısıtlamaların (bu örnekte iş kuralları) tetikleyici olarak tanımlanması gerekir.
Aşağıdaki örnek bir DML tetikleyicisi oluşturur. Bu tetikleyici, PurchaseOrderHeader
tablosuna yeni bir satınalma siparişi ekleme girişiminde bulunulduğunda satıcının kredi derecelendirmesinin iyi olup olmadığını denetler. Yeni eklenen satınalma siparişine karşılık gelen satıcının kredi derecelendirmesini almak için, Vendor
tablosuna başvurulmalı ve eklenen tabloyla birleştirilmelidir. Kredi derecelendirmesi çok düşükse, bir ileti görüntülenir ve ekleme yürütülmüyor.
USE AdventureWorks2022;
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 (ROWCOUNT_BIG() = 0)
RETURN;
IF EXISTS (SELECT 1
FROM inserted AS i
JOIN Purchasing.Vendor AS v
ON v.BusinessEntityID = i.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
Tetikleyiciler YERINE eklenen ve silinen tabloları kullanma
Tablolarda tanımlanan tetikleyiciler YERINE geçirilen eklenen ve silinen tablolar, AFTER tetikleyicilerine geçirilen eklenen ve silinen tablolarla aynı kuralları izler. Eklenen ve silinen tabloların biçimi, INSTEAD OF tetikleyicisinin tanımlandığı tablonun biçimiyle aynıdır. Eklenen ve silinen tablolardaki her sütun, doğrudan temel tablodaki bir sütuna eşler.
INSTEAD OF tetikleyicisi olan bir tabloya başvuran bir INSERT veya UPDATE deyiminin sütunlar için değer sağlaması gerektiği durumlarla ilgili aşağıdaki kurallar, tablonun INSTEAD OF tetikleyicisi olmamasıyla aynıdır:
Hesaplanan sütunlar veya zaman damgası veri türüne sahip sütunlar için değerler atanamaz.
Bu tablo için IDENTITY_INSERT AÇILMADIĞI SÜRECE, IDENTITY özelliğine sahip sütunlar için değerler belirtilemez. IDENTITY_INSERT AÇIK olduğunda, INSERT ifadeleri bir değer sağlamalıdır.
INSERT deyimleri, DEFAULT kısıtlamaları olmayan tüm NOT NULL sütunları için değerler sağlamalıdır.
Hesaplanan, kimlik veya timestamp sütunlar dışındaki tüm sütunlar için, değerler null değerlere izin veren herhangi bir sütun veya DEFAULT tanımına sahip NOT NULL sütunlar için isteğe bağlıdır.
INSERT, UPDATE veya DELETE deyimi INSTEAD OF tetikleyicisi olan bir görünüme başvurduğunda, Veritabanı Altyapısı herhangi bir tabloya karşı doğrudan eylemde bulunma yerine tetikleyiciyi çağırır. Tetikleyici, eklenen ve silinen tablolardaki bilgilerin biçimi temel tablolardaki verilerin biçiminden farklı olsa bile, temel tablolarda istenen eylemi uygulamak için gereken deyimleri oluşturmak için eklenen ve silinen tablolarda sunulan bilgileri kullanmalıdır.
Bir görünümde tanımlanan INSTEAD OF tetikleyicisine geçirilen eklenen ve silinen tabloların biçimi, görünüm için tanımlanan SELECT deyiminin seçme listesiyle eşleşir. Mesela:
USE AdventureWorks2022;
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;
Bu görünüm için sonuç kümesinin üç sütunu vardır: bir int sütunu ve iki nvarchar sütunu. Görünüm üzerinde tanımlı INSTEAD OF tetikleyicisine geçirilen eklenmiş ve silinmiş tabloların, BusinessEntityID
adlı int sütunu, LName
adlı nvarchar sütunu ve FName
adlı nvarchar sütunu da vardır.
Bir görünümün seçme listesi, tek bir temel tablo sütununa doğrudan eşlenmeyen ifadeler de içerebilir. Sabit veya işlev çağırma gibi bazı görünüm ifadeleri herhangi bir sütuna başvuramayabilir ve yoksayılabilir. Karmaşık ifadeler birden çok sütuna başvurabilir, ancak eklenen ve silinen tabloların eklenen her satır için yalnızca bir değeri vardır. Görünümdeki basit ifadeler, karmaşık bir ifadeye sahip hesaplanmış bir sütuna atıfta bulunuyorsa, aynı sorunlar geçerlidir. Görünümdeki BIR INSTEAD OF tetikleyicisi bu tür ifadeleri işlemelidir.
Performansla ilgili dikkat edilmesi gerekenler
Eklenen ve silinen tablolar sanal olduğundan bellekte yerleşik tablolar, istatistikler veya dizinler gibi özellikler kullanılamaz. Bazı kardinalite bilgileri bu tablolardan gösteriliyor olsa da, geçici olarak orada depolanacak satır sayısını göz önünde bulundururken dikkatli olmanız gerekir. Bu tablolara çok sayıda satır eklemek ve bunları sorgulamak veya diğer tablolarla birleştirmek, en uygun sorgu planlarının alt düzeyde olmasına ve yavaş sorgu yürütmesine neden olabilir. Sorgu performansı gereksinimlerinizi karşılamak için uygulamanızı dikkatlice tasarlayıp test edin.
Sonraki adımlar
Daha fazla bilgi için