触发器

  1. 触发器作用:

    a.触发器通常用于强制业务规则

    b.触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束

    c.可执行复杂的SQL语句(if/while/case) 可引用其它表中的列

    d.触发器定义在特定的表上,与表相关 不能直接调用的存储过程

    e.是一个事务(可回滚)

    ps:它是一种特殊的存储过程,也具备事务的功能,它能在多表之间执行特殊的业务规则.

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。

  2. --创建触发器语法

    create trigger trigger_name

    on  {table_name|view_name}

    {After|Instead of} {insert|update|delete}

    as 相应T-SQL语句

    数据库触发器的创建
  3. --触发器 我们用银行转账作为例子

    --创建一张银行表

    create table bank

     (    

        cardId char(9) primary key,    

        customerName CHAR(10),  --顾客姓名  

        currentMoney MONEY  default(1) check(currentMoney>0)    --当前余额

    )

    go

    create table transInfo

     (   

     cardId char(9) references bank(cardId) ,  

      transType varchar(10) not null,   

     transMoney MONEY not null

    )

    go

    INSERT INTO bank(cardId,customerName,currentMoney)    VALUES('1001 0001','张三',1000)

    INSERT INTO bank(cardId,customerName,currentMoney)    VALUES('1001 0002','李四',1)

    go

  4. create trigger trig_Trans

    on transInfo

    for insert

    as

    declare @money money

    declare @cardId char(9)

    select @cardId=cardId,@money=case transType when '支出' then -transMoney else transMoney end from inserted

    update bank set currentMoney=currentMoney+@money where cardId=@cardId

    if(@@error>0)

    begin

    raiserror('交易失败',5,1)

    rollback

    end

    else

    begin

    print('交易成功')

    --commit

    end

    go

    数据库触发器的创建
  5. 执行触发器 ,在添加数据这个操作的时候

    insert into transInfo values('1001 0001','支取',200)insert into transInfo values('1001 0002','存入',20000)insert into transInfo values('1001 0002','支取',20001)

    数据库触发器的创建
  6. create trigger trig_Bank

    on bank

    for update

    as

    declare @newMoney money

    declare @oldMoney money

    declare @money money

    declare @cardId char(9)

    select @cardId=cardId,@newMoney=currentMoney from inserted

    select @oldMoney=currentMoney from deleted

    set @money= abs(@newMoney-@oldMoney)

    if(@money>20000)

    begin

    raiserror('每笔交易金额不能超过20000元,交易失败',6,1)

    print('交易金额:'+convert(varchar(20),@money))

    rollback

    end

    else

    begin

    print('交易成功!交易金额:'+convert(varchar(20),@money))

    print('帐号:'+convert(varchar(20),@cardId)+'帐户余额:'+convert(varchar(20),@newMoney))

    end

    go

    数据库触发器的创建
  7. 触发器--删除触发:

    delete bank where cardId='1001 0003'

    数据库触发器的创建
  8. 触发器触发时:

    系统自动在内存中创建deleted表或inserted表

    只读,不允许修改;触发器执行完成后,自动删除

    数据库触发器的创建

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值