inserted ve deleted sanal tabloları
| İşlem | inserted | deleted |
|---|---|---|
| INSERT | Yeni satırlar | Boş |
| UPDATE | Yeni değerler | Eski değerler |
| DELETE | Boş | Silinen satırlar |
SQL Server trigger'ı ifade başına bir kez çalışır; bu tablolar etkilenen tüm satırları içerir. Bu yüzden her zaman küme bazlı (JOIN ile) yaz.
CREATE TABLE order_audit (
order_id INT,
old_status NVARCHAR(20),
new_status NVARCHAR(20),
changed_at DATETIME2 DEFAULT SYSDATETIME()
);
GO
CREATE TRIGGER trg_order_status ON orders
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO order_audit (order_id, old_status, new_status)
SELECT d.order_id, d.status, i.status
FROM deleted d
JOIN inserted i ON i.order_id = d.order_id
WHERE d.status <> i.status;
END;
GO
UPDATE orders SET status = 'delivered'
WHERE status = 'shipped' AND order_date < '2024-12-01';
SELECT order_id, old_status, new_status FROM order_audit ORDER BY order_id;
INSTEAD OF triggerAsıl işlemin yerine çalışır; çoğunlukla birden çok tabloya dayanan view'ları güncellenebilir yapmak için kullanılır. Bu taklitte AFTER trigger'lar desteklenir.
AlternatiflerDenetim kaydı için SQL Server'ın yerleşik Temporal Tables (sistem sürümlü tablolar), Change Data Capture ve SQL Server Audit özellikleri trigger'dan daha az bakım gerektirir.