zoukankan      html  css  js  c++  java
  • SQL触发器

    --创建交易详细表
     use MoneyManager
     if(exists(select * from sysobjects where name='transinfo'))
        drop table transinfo
     create table transinfo
     (
        id varchar(20) primary key not null,
        transdate date,
        tarnstype nvarchar(2),
        transmoney money,
        remark nvarchar(256)
     )
     go
     --给表transinfo创建插入触发器,给交易表插入一条交易信息,更新账户余额。
     alter trigger tg_transifno_insert
     on transinfo
     after insert --for等价于after是已经插入基表,可以回滚回去。instead of 还没有插入基表
    
     as
     declare @userid varchar(20)
     declare @money money
     declare @type nvarchar(2)
     declare @yue money
     set nocount on
     select @userid=id,@money=transmoney,@type=tarnstype from inserted
     if(@type='支取')
     begin 
           
           select  @yue=[money] from t_money where userid=@userid
           print('支取前的余额是:'+convert(varchar(10),@yue))
           update t_money set [money]=[money]-@money where userid=@userid
           print('支取了:'+convert(varchar(10),@money))
           select  @yue=[money] from t_money where userid=@userid
           print('支取后的余额是:'+convert(varchar(10),@yue))
     end
     else if(@type='存入')
     begin
           
            select  @yue=[money] from t_money where userid=@userid
            print('存入前的余额是:'+convert(varchar(10),@yue))
            update t_money set [money]=[money]+@money where userid=@userid
            print('存入了:'+convert(varchar(10),@money))
            select  @yue=[money] from t_money where userid=@userid
            print('存入后的余额是:'+convert(varchar(10),@yue))
     end
     go
     --测试语句
     insert into transinfo values (2222,GETDATE(),'支取',300,'');
     go
     --给表transinfo创建删除触发器,删除一条交易信息,并备份到transbacktable表
     alter trigger tg_transinfo_delete
     on transinfo
     for delete
     as
        set nocount no
        if(not Exists(select * from sysobjects where name='transbacktable'))
        begin
         select * into transbacktable from deleted
         end
         else
         begin
            insert into transbacktable select * from deleted
         end
     
     go
     --测试语句
        delete from dbo.transinfo where id='2222'
     go
      --给表t_money创建更新发器,单笔交易大于500就停止交易
      create trigger tg_t_money_update
      on t_money
      for update
      as
        set nocount no
        declare @beformoney money
        declare @aftermoney money
        select @beformoney=[money] from deleted
        select @aftermoney=[money] from inserted
        if(abs(@aftermoney-@beformoney)>500)
        begin
            raiserror('单笔交易不能大于500',16,1)
            rollback transaction
        end
     go
     --测试语句
     update t_money set [money]=[money]+500
     go
      --给表transinfo的transdate列创建更新发器,禁止更新
      create trigger tg_transinfo_transdateupdate
      on transinfo
      for update
      as
      set nocount on
      if(update(transdate))
      begin
          raiserror('禁止更改交易时间',16,1)
          rollback transaction
      end
      go
  • 相关阅读:
    Delphi数据库处理
    delphi 递归的方法
    C#中StringBuilder用法以及和String的区别
    算法导论12.2节习题解答
    算法导论9.11习题解答(二叉树)
    算法导论10.15习题解答(deque实现源码)
    算法导论9.39习题解答(寻找中位数)
    算法导论84习题解答
    算法导论10.17习题解答(用两个队列实现一个栈)
    算法导论10.27习题解答(单链表逆转)
  • 原文地址:https://www.cnblogs.com/zcttxs/p/3061249.html
Copyright © 2011-2022 走看看