对oracle中的pl/sql编程还是比较熟悉的,但是sql
server2005编写自定义函数、存储过程、触发器等确实跟Oracle语法相差太大,就触发器这一点可以看出Oracle确实比sql
server强悍,起码可以控制在插入前、后的操作。但是sql server却没有。
【问题】
项目用到了My SQL和Sql Server 2005的同步问题,My SQL每天固定的时间跟Sql Server
2005同步一次。那么这所谓的同步不可能是每次将My SQL中表信息全部删除,再从Sql Server2005中拷贝一次。而应该是只更新Sql
Server中变化的东西。
【思路】
1.在sql server2005每一次增删改的时候,我们都记录到一个表(假如入叫synSql)【这个表有两个字段,一个存放着sql语句,比如:insert
into student(sname,sage,srollno)
values('hope',12,'1001')的这种信息;另外一个存放标志位,即表明是否被执行】中。
那么My SQL在与Sql Server保持同步的时候,仅仅只是遍历synSql,执行这里面没有执行过的语句。
2.记录synSql的这个表中的信息,不可能由别的用户在插入的时候完成,这里我们使用触发器。
3.触发器使用:
drop trigger insertTest //删除触发器
创建触发器【这里仅仅写了一个插入的实例】
create
trigger insertTest
on test//test是被操作的表名
for insert//是指在插入的时候
as
begin
//这里全部用字符即可,没有必要具体到int,datetime等,具体原理大家也明白
declare @sname varchar(50)
declare
@sage varchar(10)
declare @srollno varchar(50)
declare @result
varchar(2000)
//Inserted是插入之前的表信息,类似于oracle中的old:,LTRIM(RTRIM(sname))是用来去掉多余空格的。
set @sname=(select LTRIM(RTRIM(sname)) from Inserted)
//sage在表中是int型,所以读取出来的信息中没有空格,所以不用trim
set @sage=(select sage from
Inserted)
set @srollno =(select LTRIM(RTRIM(srollno)) from Inserted)
//还有一个需要注意的问题,在sql中如果输出单引号(')那么需要写两个单引号('')
set
@result='insert into test(sname,sage,srollno) values('''+@sname+''','+(@sage)+','''+@srollno+''')'
insert
into sql(sql) values(@result)
Raiserror('插入失败啦,哈哈~~~!',16,-1)
end
【测试结果】
当我在test表中加入一条信息的时候,通过触发器将该信息插入到synSql表格中。
insert into test(sname,sage,srollno) values('haha',1,'1007');
select *
from synSql;//即可看到信息已经插入了