SqlServer觸發器的使用
首先:說明一個觸發器使用的場景。
1.伺服器0001上的Employee表負責儲存公司所有員工的最新資料,新員工入職、員工更換部門以及員工離職等資訊都存在該表中。
2.由於業務需求,公司新上了一個OA系統,為了確保系統正常平穩執行且不影響公司其他伺服器,所以OA系統就部署在了0002伺服器上。
3.OA系統需要公司員工的最新資訊,但是遠端連線頻繁調取0001伺服器上的Employee表會影響到0001伺服器的執行,而且OA系統需要員工最新的基礎資訊(姓名、工號、部門、在職狀態)以及新增一些自定義的員工資訊,資訊存在EmpInfo表中。
基於以上場景,考慮使用觸發器來完成。即在0001伺服器上Employee表新增觸發器來對0002伺服器上的EmpInfo表進行更新操作。
步驟1:分析需要建立的觸發器的型別
新員工入職,Emoloyee表會新增資料,Insert觸發器。
員工更換部門,Employee表會更新資料,Update觸發器。
員工離職,Employee表會刪除資料(一般不會刪除資料,但是為了下面有關刪除情況的觸發器操作,所以這裡作此假設),Delete觸發器。
步驟2:在0001伺服器上建立0002伺服器的遠端連線
因為要對0002伺服器的EmpInfo表進行增刪改操作,所以需要先建立遠端連線,指令碼如下:
exec sp_addlinkedserver 'server0002', ' ', 'SQLOLEDB ', '192.168.0.1'
exec sp_addlinkedsrvlogin 'server0002
步驟3:編寫觸發器指令碼
Insert觸發器:
create trigger trigger_sync_userdata_insert
on Employee
for insert
as
begin
--對EmpInfo進行批量插入操作
insert server0002.dbo.EmpInfo select * from inserted
end
go
Update觸發器:
create trigger trigger_sync_userdata_update on Employee for update as begin --對EmpInfo進行批量更新操作 update a set a.Dept=b.Dept, a.Statues=b.Statues from server0002.dbo.EmpInfo a inner join inserted b on a.EmployeeNo= b.EmployeeNo end go
Delete觸發器:
create trigger trigger_sync_userdata_delete
on Employee
for delete
as
begin
--對EmpInfo進行批量刪除操作
delete from server0002.dbo.EmpInfo where EmployeeNo in (select EmployeeNo from deleted)
end
go
如上所示:三種觸發器已經建好,當0001伺服器的Employee表的資料進行增刪改的時候,對應的0002伺服器的EmpInfo表的資料也會對應的進行增刪改操作。
備註:
1.插入操作(Insert)
Inserted表有資料,Deleted表無資料
2.更新操作(Update)
Inserted表有資料(新資料),Deleted表有資料(舊資料)
3.刪除操作(Delete)
Inserted表無資料,Deleted表有資料