Trigger_4
7 Ocak 2017 Cumartesi
Resim1'deki şema uyarınca elimizde tblEmployees ve tblDepartment isimli 2 adet tablo mevcut. Bu tablolar üzerinden vw_EmployeeDetails isimli bir view oluşturuyoruz.
Şayet bu view üzerinden bir silme işlemi gerçekleştirmeye kalkarsanız, örneğin;
delete from vw_EmployeeDetails where ID=1
Şu şekilde bir hata koduyla karşılaşırsınız:
View or function 'vw_EmployeeDetails' is not updatable because the modification affects multiple base tables.
Yani silmeye çalıştığınız view birden fazla ana tablodan oluştuğu için SQL Server bu işlemi yapamıyor. Dolayısıyla bu yükün altından kalkabilmemiz için bu view üzerinden bir trigger tanımlamamız gerekiyor.
CREATE TRIGGER trg_vw_EmployeeDetails_INSTEADOFDELETE
ON vw_EmployeeDetails
INSTEAD OF DELETE
AS
BEGIN
DELETE tblEmployees
FROM tblEmployees t JOIN deleted d ON t.ID=d.ID
END
Not: Çoğu zaman JOIN, SUB-QUERY'den daha hızlı çalışır. Ancak bir tablodaki alt kümeye ihtiyacınız var ise SUB-QUERY kullanılması makul olabilir. Aşağıda aynı örneğimizi SUB-QUERY kullanarak çözümlüyoruz.
ALTER TRIGGER trg_vw_EmployeeDetails_INSTEADOFDELETE
ON vw_EmployeeDetails
INSTEAD OF DELETE
AS
BEGIN
DELETE FROM tblEmployees
WHERE ID IN (SELECT ID FROM deleted)
END
Bu tanımlamadan sonra artık view üzerinde silme işlemlerini rahatlıkla yapabilir konuma gelmiş oluyoruz.