需求描述
最近有一个需求,主要是将另外一个系统的数据导入我所负责的系统中,然后在该数据的基础上,做一些应用。不要问我,为什么不用rest full 接口来做。一则,另外一个系统所用的技术不同,重新开发比较麻烦。另外,由于两个数据库类型不同,不再同一个局域网等条件限制,我们也不能采用数据备份方案。
方案
为了解决这个问题,经过仔细考虑,最终采用触发器记录变动,定时程序同步数据的方案。对需要同步的表,分别建立监控insert,update,delete 三个操作的触发器,让后将变更信息插入到变更表中,并初始化状态为0,定时程序定时扫描变更记录表,更具表更记录对需要同步表的变更记录进行相应处理。该处理方式同样是通过restfull接口调用实现。
其大致流程如下:
sequenceDiagram
participant student
participant change_record
participant scheduleTask
participant mySystem
student->>change_record: 新增记录
student->>change_record: 删除记录
student->>change_record: 修改记录
Note right of change_record: 记录变更信息 <br/>需要区分类型 <br/> 分别为<br/>insert,update,delete
scheduleTask ->> change_record:获取需要处理的变更记录
change_record ->> student: 根据记录拉取新增,修改数据
student->> scheduleTask:获取变动记录内容,包括新增、删除、修改内容
Note right of scheduleTask: 其中删除信息在change_record记录中,类型为delete
scheduleTask ->> mySystem: 通过接口做相应操作
相应sql语句
--创建学生表
create table student(
id int identity(1,1) primary key,
stu_name varchar(10),
stu_gender char(2),
stu_age int
)
-- 触发器记录表
create table change_record(
id int identity(1,1) primary key,
change_id int,
type varchar(10),
source varchar(20),
create_date datetime
)
-- insert记录触发器
create trigger trig_insert
on student
after insert
as
begin
declare @changeId int;
select @changeId = id from inserted;
INSERT dbo.change_record (change_id,type,source,create_date) VALUES (@changeId,'insert','student',GETDATE());
end
-- insert触发器测试
insert into student(stu_name,stu_gender,stu_age)values('吕布','男',30);
select * from change_record;
insert into student(stu_name,stu_gender,stu_age)values('貂蝉','女',30);
select * from change_record;
-- update记录触发器
create trigger trig_update
on student
after update
as
begin
declare @changeId int;
select @changeId = id from inserted;
INSERT dbo.change_record (change_id,type,source,create_date) VALUES (@changeId,'update','student',GETDATE());
end
-- 备注:sql server update逻辑是先想deleted中插入一条老的记录,然后向inserted中插入一条新的记录,我们需要的是更新记录的id,所有从inserted或deleted中任何一个获取id都可以,如果需要变动内容的话,可能就需要区分老数据跟新数据了。
-- update触发器测试
update [dbo].[student] set stu_age = 10 WHERE id = 1;
select * from change_record;
-- delete记录触发器
create trigger trig_delete
on student
after delete
as
begin
declare @changeId int;
select @changeId = id from deleted;
INSERT dbo.change_record (change_id,type,source,create_date) VALUES (@changeId,'delete','student',GETDATE());
end
--delete触发器测试
DELETE FROM [dbo].[student] WHERE id = 1;
select * from change_record;
总结
通过触发器随时记录目标表中的变更记录,对原来系统的入侵性最小。触发器在设计时,仅仅记录目标变更记录的自增id,与发生的操作类型,没有做过多的处理,如比对变更字段等,这些内容直接更新mySystem中的记录即可。简单,方便,粗暴,有效。而且还很节省时间。
转载自原文链接, 如需删除请联系管理员。
原文链接:触发器的小应用,转载请注明来源!