Tetikleyici oluşturma

Tamamlandı

Tetikleyiciler , veritabanınızda belirli olaylar gerçekleştiğinde otomatik olarak yürütülen özel saklı yordamlardır. Uygulama düzeyinde kod gerektirmeden veri bütünlüğünü korumak, iş kurallarını zorunlu tutmak ve veritabanı işlemlerini otomatikleştirmek için tetikleyiciler tanımlarsınız.

Tetikleyici temellerini anlama

Tetikleyici, veritabanınızdaki veri değişikliklerine veya şema değişikliklerine yanıt verir. Tetikleyici oluşturduğunuzda, tetikleyiciyi etkinleştiren olayı ve gerçekleştirdiği eylemleri belirtirsiniz.

Tetikleyiciler otomatik olarak yürütülür. Açıkça çağırdığınız saklı yordamlardan farklı olarak, tetikleyiciler INSERT, UPDATE, DELETE veya DDL ifadelerine yanıt olarak tetiklenir. Bu otomatik yürütme, tüm veri değişikliklerinde tutarlı bir şekilde uygulanması gereken kuralları zorunlu tutma konusunda onları güçlü hale getirir.

SQL Server iki ana tetikleyici kategorisini destekler: DML (Veri İşleme Dili) tetikleyicileri ve DDL (Veri Tanım Dili) tetikleyicileri. DML tetikleyicileri tablo verilerindeki değişikliklere, DDL tetikleyicileri ise , CREATEveya ALTER deyimleri gibi DROPşema değişikliklerine yanıt verir.

Veri değişiklikleri için DML tetikleyicileri oluşturma

DML tetikleyicileri, tablo veya görünümlerdeki veri değişikliklerini izler ve yanıtlar. Bunları AFTER tetikleyicileri veya İNSTEAD OF tetikleyicileri olarak tanımlarsınız.

AFTER tetikleyicileri tetikleyici deyimi tamamlandıktan sonra yürütülür. Veritabanı önce veri değişikliğini gerçekleştirir, ardından tetikleyici kodunu çalıştırır. Değişiklikleri doğrulamak, ilgili tabloları güncelleştirmek veya değişiklikleri günlüğe kaydetmek için AFTER tetikleyicilerini kullanırsınız:

CREATE TRIGGER tr_UpdateInventory
ON Sales.OrderDetails
AFTER INSERT
AS
BEGIN
    UPDATE Inventory.Products
    SET QuantityInStock = QuantityInStock - i.Quantity
    FROM Inventory.Products p
    INNER JOIN inserted i ON p.ProductID = i.ProductID;
END;

INSTEAD OF tetikleyicileri özgün veri değişikliği deyiminin yerini alır. Tetikleyici kodu, INSERT, UPDATE veya DELETE işlemi yerine yürütülür. Normalde doğrudan değişiklikleri kabul etmeyen görünümleri değiştirmek veya karmaşık iş mantığı uygulamak için INSTEAD OF tetikleyicilerini kullanırsınız:

CREATE TRIGGER tr_UpdateOrderView
ON Sales.OrderSummaryView
INSTEAD OF UPDATE
AS
BEGIN
    UPDATE Sales.Orders
    SET OrderStatus = i.OrderStatus,
        ModifiedDate = GETDATE()
    FROM Sales.Orders o
    INNER JOIN inserted i ON o.OrderID = i.OrderID;
END;

DML tetikleyicileri ile eklenen ve silinen sahte tablolara erişilir. Bu geçici tablolar, etkilenen satırların kopyalarını depolar. INSERT işlemler eklenen tabloyu doldurur, DELETE işlemler silinen tabloyu doldurur ve UPDATE işlemler her iki tabloyu da silinen eski değerlerle ve eklenen yeni değerlerle doldurur.

Belirli olaylar için tetikleyicileri uygulama

Tetikleyicinizi hangi veri değişikliği olaylarının etkinleştireceğini belirtirsiniz. Tek bir tetikleyici, tetikleyici tanımında INSERT, UPDATE ve DELETE birleştirerek birden çok olaya yanıt verebilir.

Hassas denetim için her işlem için ayrı tetikleyiciler oluşturursunuz. Bu yaklaşım kodunuzu basitleştirir ve tetikleyicilerinizin bakımını kolaylaştırır:

CREATE TRIGGER tr_LogPriceChanges
ON Products.Catalog
AFTER UPDATE
AS
BEGIN
    IF UPDATE(Price)
    BEGIN
        INSERT INTO Audit.PriceHistory (ProductID, OldPrice, NewPrice, ChangeDate)
        SELECT d.ProductID, d.Price, i.Price, GETDATE()
        FROM deleted d
        INNER JOIN inserted i ON d.ProductID = i.ProductID
        WHERE d.Price <> i.Price;
    END;
END;

Aynı zamanda, aynı mantık birden çok işlem için geçerli olduğunda olayları birleştirebilirsiniz. Örneğin, INSERT, UPDATE ve DELETE unsurlarına yanıt veren tek bir denetim tetikleyicisi oluşturabilirsiniz:

CREATE TRIGGER tr_AuditEmployeeChanges
ON HR.Employees
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
    DECLARE @Operation NVARCHAR(10);
    
    IF EXISTS (SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)
        SET @Operation = 'INSERT';
    ELSE IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
        SET @Operation = 'UPDATE';
    ELSE
        SET @Operation = 'DELETE';
    
    INSERT INTO Audit.EmployeeLog (EmployeeID, Operation, ChangeDate)
    SELECT COALESCE(i.EmployeeID, d.EmployeeID), @Operation, GETDATE()
    FROM inserted i
    FULL OUTER JOIN deleted d ON i.EmployeeID = d.EmployeeID;
END;

işlevi hangi UPDATE() sütunların değiştiğini belirlemenize yardımcı olur. İş mantığınız için yalnızca belirli alanlar önemli olduğunda gereksiz işlemeden kaçınmak için belirli sütunları denetlersiniz.

En iyi tetikleyici uygulamalarını kullanın

Tetikleyiciler, her uygun işlemle birlikte çalıştıkları için veritabanı performansını etkiler. İşlem aktarım hızı üzerindeki etkiyi en aza indirmek için verimli tetikleyici kodu yazarsınız.

Tetikleyici mantığınızı odaklanmış ve minimal düzeyde tutun. Tetikleyici gövdesinde yalnızca temel işlemleri yürütün. Karmaşık veya zaman alan işlemler için olay ayrıntılarını günlüğe kaydetmeyi ve bunları ayrı bir iş aracılığıyla zaman uyumsuz olarak işlemeyi göz önünde bulundurun:

CREATE TRIGGER tr_QueueLargeOrders
ON Sales.Orders
AFTER INSERT
AS
BEGIN
    INSERT INTO Processing.OrderQueue (OrderID, TotalAmount, QueuedDate)
    SELECT OrderID, TotalAmount, GETDATE()
    FROM inserted
    WHERE TotalAmount > 10000;
END;

Aynı tetikleyicinin tekrar çalışmasına neden olan tetikleyici değişikliklerinden kaynaklanan özyinelemeli işlemlerden kaçının. RECURSIVE_TRIGGERS Veritabanı seçeneğini uygun şekilde ayarlayın ve sonsuz döngüleri önlemek için tetikleyicilerinizi tasarlayın.

Tetikleyicilerde hataları doğru bir şekilde ele alın. İşlem davranışı hata işlemenize bağlıdır. Bir tetikleyici bir hatayla karşılaşırsa ve bunu işlemezseniz, SQL Server hem tetikleyiciyi hem de özgün deyimini geri alır:

CREATE TRIGGER tr_ValidateOrderDate
ON Sales.Orders
AFTER INSERT, UPDATE
AS
BEGIN
    IF EXISTS (SELECT * FROM inserted WHERE OrderDate > GETDATE())
    BEGIN
        THROW 50001, 'Order date cannot be in the future', 1;
    END;
END;

Tetikleyicilerinizi ayrıntılı bir şekilde belgeleme. Diğer geliştiricilerin tetikleyicilerin neden var olduğunu ve normal veritabanı işlemleri sırasında görünmez bir şekilde yürütürken ne yaptıklarını anlaması gerekir.

Tetikleyici oluşturma ve uygulama hakkında bilgi edindiğinize göre, kapsamlı veritabanı çözümleri oluşturmak için diğer programlama nesneleriyle nasıl tümleştirildiğini keşfetmeye hazırsınız.