zoukankan      html  css  js  c++  java
  • 触发器的使用

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

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

    --‘删除操作’触发器

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

  • 相关阅读:
    找一个写心的地方!
    找一个写心的地方!
    CentOS 6.4最小安装
    poj 3013 Big Christmas Tree 最短路 dijkstra算法
    poj 2449 Remmarguts' Date 第K短路
    CCNUOJ 1010 The Almost Lucky Numbers
    Java容器学习心得Set容器
    CCNUOJ 1027 教你前缀
    我的第一个C++程序( C++语言程序设计项目任务书 )
    CCNUOJ 1031 数组操作(树状数组)
  • 原文地址:https://www.cnblogs.com/xushining/p/3156364.html
Copyright © 2011-2022 走看看