由于公司项目系统要和外部业务系统对接,两个系统的数据交换需要中间表。当外部业务系统对中间表更新数据时,公司的项目系统数据也要跟着更新。
基于这个要求,所以要用到触发器。因为以前没用过,今天专门研究了,下面是源码:
--‘删除操作’触发器
1 Create trigger [dbo].[trig_BS_Call_Branch_Temp_delete] on [dbo].[BS_Call_Branch_Temp] 2 after delete 3 as 4 5 --1.删除‘分行表’数据 6 delete from BS_Call_Branch where DepartmentGuid in (select DepartmentGuid from deleted)
--‘新增操作’触发器
1 create trigger [dbo].[trig_BS_Call_Branch_Temp_insert] on [dbo].[BS_Call_Branch_Temp] 2 after insert 3 as 4 5 declare @DepartmentGuid nvarchar(38) 6 declare tc_bcbti_insert cursor 7 8 for select DepartmentGuid from inserted 9 open tc_bcbti_insert 10 fetch next from tc_bcbti_insert into @DepartmentGuid 11 12 while @@fetch_status = 0 13 begin 14 15 begin transaction 16 17 declare @errorSum int 18 set @errorSum = 0 19 20 --1.删除‘分行表’数据 21 delete from BS_Call_Branch where DepartmentGuid = @DepartmentGuid 22 set @errorSum = @errorSum + @@error 23 24 --2.添加'分行表’数据 25 insert into BS_Call_Branch (DepartmentGuid, DepartmentName, DepartmenMagGuid, DepartmentMagName, DepartmentLinkEmail) 26 select n.DepartmentGuid, n.DepartmentName, n.DepartmenMagGuid, n.DepartmentMagName, n.DepartmentLinkEmail 27 from BS_Call_Branch_Temp n 28 where n.DepartmentGuid = @DepartmentGuid 29 set @errorSum = @errorSum + @@error 30 31 if @errorSum <> 0 32 rollback transaction 33 else 34 commit transaction 35 36 fetch next from tc_bcbti_insert into @DepartmentGuid 37 end 38 close tc_bcbti_insert 39 deallocate tc_bcbti_insert
--‘更新操作’触发器
create trigger [dbo].[trig_BS_Call_Branch_Temp_update] on [dbo].[BS_Call_Branch_Temp] after update as declare @DepartmentGuid nvarchar(38) declare tc_bcbtu_update cursor for select DepartmentGuid from inserted open tc_bcbtu_update fetch next from tc_bcbtu_update into @DepartmentGuid while @@fetch_status = 0 begin begin transaction declare @errorSum int set @errorSum = 0 --1.删除‘分行表’数据 delete from BS_Call_Branch where DepartmentGuid =@DepartmentGuid set @errorSum = @errorSum + @@error --2.添加'分行表’数据 insert into BS_Call_Branch (DepartmentGuid, DepartmentName, DepartmenMagGuid, DepartmentMagName, DepartmentLinkEmail) select n.DepartmentGuid, n.DepartmentName, n.DepartmenMagGuid, n.DepartmentMagName, n.DepartmentLinkEmail from BS_Call_Branch_Temp n where n.DepartmentGuid = @DepartmentGuid set @errorSum = @errorSum + @@error if @errorSum <> 0 rollback transaction else commit transaction fetch next from tc_bcbtu_update into @DepartmentGuid end close tc_bcbtu_update deallocate tc_bcbtu_update
说明:
创建触发器的语法:
create trigger trigger_name
on {table_name | view_name}
{for | After | Instead of }
[ insert, update,delete ]
as
sql_statement
deleted 和 inserted 表:
在触发器运行时,数据库会自动为我们创建 deleted ,inserted两个表,你新增或者删除后的数据会临时保存在这两个表中,
当触发器结束执行,这两个表的内容就会丢失。你可以查询这两张表,获得想要的操作条件。
sqlServer并没有updated表,因为update其实就是delete和insert的组合。先delete后insert。
cursor 游标:
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制,类似于ADO.NET里面的reader.read()。
declare tc_bcbtu_update cursor
for select DepartmentGuid from inserted
这段代码的意思是声明游标 tc_bcbtu_update,并把inseted临时表的内容放入tc_bcbtu_update。
fetch next from tc_bcbtu_update into @DepartmentGuid
意思是往下读取一条数据(这个游标只有一列),放入变量@DepartmentGuid
insert into selete from :
把一个表的内容copy到另一表。
如果两表字段相同,则可以直接这样用。
insert into table_a select * from table_b
如果两表字段不同,a表需要b中的某几个字段即可,则可以如下使用:
insert into table_a(field_a1,field_a2,field_a3) select field_b1,field_b2,field_b3) from table_b
以上语句前提条件是每个字段对应的字段类型相同或可以自动转换。