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

    --1.什么是触发器
    --触发器是在对表进行插入、更新或删除操作时自动执行的存储过程
    --触发器通常用于强制业务规则
    --触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 
    --触发器定义在特定的表上,与表相关
    --自动触发执行
    --不能直接调用
    --是一个事务(可回滚)
    --2.触发器的类型
    --DELETE 触发器   INSERT 触发器  UPDATE 触发器
    
    --3.创建触发器
    --CREATE TRIGGER trigger_name
    -- ON table_name
    -- FOR [DELETE, INSERT, UPDATE]
    -- AS 
    --  T-SQL语句
    --GO
    
    create table transinfo
    (
       cardId varchar(7),
       transType varchar(4),
       transMoney decimal(18,2)
    )
    
    --3.1解决上述的银行取款问题:当向交易信息表(transInfo)中插入一条交易信息时
    --我们应自动更新对应帐户的余额。 
    create trigger trig_transInfo
    on transinfo
    for insert--insert触发器,系统自动生成inserted表
    as
    --inserted表中临时保存了被插入或被更新后的记录行
    declare @cardid varchar(7)
    declare @transType varchar(4)
    declare @transMoney decimal(18,2)
    --select * from inserted:理解inserted表
    select @cardid=cardId,@transType=transType,
    @transMoney=transMoney from inserted
    if @transType='支取'
        update bank set currentMoney=currentMoney-@transMoney
         where cardid=@cardid
    else
        update bank set currentMoney=currentMoney+@transMoney
         where cardid=@cardid
    go
    
    --当向transinfo表中插入数据时,触发trig_transinfo触发器
    insert transinfo values('1001101','存款',200)
    
    --3.2当删除交易信息表时,要求自动备份被删除的数据到表backupTable中 
    create trigger trig_delete_transinfo
    on transinfo
    for delete --delete触发器只会生deleted表
    as
    if exists(select * from sysobjects where name='backupTable')
      begin
        print '备份到已存在的backupTable表中'
        insert into backupTable select * from deleted
      end
    else
      begin
        print '备份到不存在的backupTable表中'
        select * into backupTable from deleted 
      end
    go
    
    --当删除transinfo表中的数据时,触发trig_delete_transinfo触发器
    delete from transinfo
    
    --3.3跟踪用户的交易,交易金额超过20000元,
    --则取消交易,并给出错误提示。                   
    alter trigger trig_update_bank
    on bank
    for update--update触发器,系统自动成inserted,deleted表
    as
    declare @bMoney decimal(18,2)
    declare @aMoney decimal(18,2)
    select @bMoney=currentMoney from deleted
    select @aMoney=currentMOney from inserted
    if abs(@aMoney-@bMoney)>20000
       begin
         print '交易额不能超过20000'
         rollback tran
       end
    else
       begin
         print '交易成功'
       end
    go
    
    --当向transinfo表中插入数据时,触发trig_transinfo触发器
    --trig_transinfo触发器中修改bank表数据,再次触发trig_update_bank触发器
    insert transinfo values('1001101','存款',1000)
    
    
    
    --触发器触发时:
    --系统自动在内存中创建deleted表或inserted表
    --只读,不允许修改;触发器执行完成后,自动删除
    --inserted 表 
    --用于存储 INSERT 和 UPDATE 语句所影响的行的副本,即在inserted 表中临时保存了被插入或被更新后的记录行。在执行INSERT 或 UPDATE 语句时,新加行被同时添加到 inserted 表和触发器表中。由此我们可以从inserted检查插入的数据是否满足业务需求。如果不满足,就可以向用户报告错误消息,并回滚撤销操作。 
    --deleted 表
    --用于存储 DELETE 和 UPDATE 语句所影响的行的副本,即在deleted表中临时保存了被删除或被更新前的记录行。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。由此我们可以从deleted 表中检查删除的数据行是否能删除。如果不能,就可以回滚撤销此操作,因为触发器本身就是一个特殊的事务单元。
  • 相关阅读:
    知识图谱应急安全场景应用规划
    DataxWeb 设置运行错误
    Datax mysql 8.x elasticsearch 7.x 测试成功json样例
    testmysqltoelasticsearch76.json 未测试,仅参考
    testmysqltoelasticsearch75.json 未测试,仅参考
    testorcletoelasticsearch73.json 微测试,仅参考
    testmysqltoelasticsearch74.json 未测试,仅参考
    testmysqltoelasticsearch72.json 微测试,仅参考
    go可变参数
    Java 8 终于支持 Docker !
  • 原文地址:https://www.cnblogs.com/kite/p/3635589.html
Copyright © 2011-2022 走看看