Trigger_3
6 Ocak 2017 Cuma
Resim-1'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 güncelleme işlemi gerçekleştirmeye kalkarsanız, örneğin;
update vw_EmployeeDetails set Name='Suzan', DeptName='IT' 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 güncellemeye çalıştığınız view birden fazla ana tablodan oluştuğu için SQL Server bu işlemi yapamıyor.
Bu işlemi sağlıklı şekilde yapabilmek için INSTEAD OF UPDATE trigger'ı kullanmamız gerekir.
CREATE TRIGGER trg_vw_EmployeeDetails_INSTEADOFUPDATE
ON vw_EmployeeDetails
INSTEAD OF UPDATE
AS
BEGIN
IF(UPDATE(ID))
BEGIN
RAISERROR('Id cannot be changed',16,1)
RETURN
END
IF(UPDATE(DeptName))
BEGIN
DECLARE @DeptID INT
SELECT @DeptID=DeptID
FROM tblDepartment t JOIN inserted i ON i.DeptName=t.DeptName
IF(@DeptID IS NULL)
BEGIN
RAISERROR('Invalid Department Name', 16, 1)
RETURN
END
UPDATE tblEmployees SET DepartmentID=@DeptID from inserted i JOIN tblEmployees t on t.ID=i.ID
END
IF (UPDATE(Gender))
BEGIN
UPDATE tblEmployees SET Gender=i.Gender FROM inserted i JOIN tblEmployees t ON t.ID=i.ID
END
IF(UPDATE(Name))
BEGIN
UPDATE tblEmployees SET Name=i.Name from inserted i JOIN tblEmployees t ON t.ID=i.ID
END
END