触发器的使用

由于公司项目系统要和外部业务系统对接,两个系统的数据交换需要中间表。当外部业务系统对中间表更新数据时,公司的项目系统数据也要跟着更新。

基于这个要求,所以要用到触发器。因为以前没用过,今天专门研究了,下面是源码:

--‘删除操作’触发器

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
以上语句前提条件是每个字段对应的字段类型相同或可以自动转换。

原文地址:https://www.cnblogs.com/xushining/p/3156364.html