• SQL Server触发器的基本语法与作用


    什么是触发器?

    • 触发器是在对表进行插入、更新或删除操作时自动执行的存储过程
    • 触发器通常用于强制业务规则
    • 触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 :可执行复杂的SQL语句(if/while/case)、可引用其它表中的列
    • 触发器定义在特定的表上,与表相关。
    •  自动触发执行
    •  不能直接调用
    •  是一个事务(可回滚)

    使用触发器的好处

    触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。

    触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用

    其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,

    如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。

    一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。

    触发器的类型

    • *DELETE 触发器
    • INSERT 触发器
    • UPDATE 触发器

    创建触发的语法

    CREATE TRIGGER trigger_name
     ON table_name
     [WITH ENCRYPTION]
      FOR [DELETE, INSERT, UPDATE]
     AS 
      T-SQL语句
    GO

    注意:WITH ENCRYPTION表示加密触发器定义的SQL文本 DELETE, INSERT, UPDATE指定触发器的类型

    insert 触发器示例

    /*创建insert触发器,在上网记录表recordInfo上创建插入触发器*/
    create trigger tr_insert_recordInfo
    on recordInfo
    for insert
     as
    /*定义变量,用于临时存储插入的会员号、电脑编号和卡的编号*/
    declare @cardId char(10)
    declare @PCId int
    declare @CardNumber char(10)
    /*从inserted临时表中获取插入的记录行的信息,包括电脑的编号、卡的编号*/
    select @PCId=PCId,@cardId=CardId from inserted
    /*根据电脑编号修改电脑的使用状态*/
    update PCInfo set PCUse=1 where PCId=@PCId
    /*根据卡的编号查询会员号*/
    select @CardNumber=CardNumber from cardinfo where CardId=@cardid
    /*显示上机成功的信息*/
    print '上机成功!会员号是:'+@CardNumber+'机器号是:'+convert(char(10),@PCId)
    go
    ----插入测试数据,会员号为的上机
    set nocount on      --不显示sql语句影响的记录行数
    declare @CardId int   ---声明一个存储卡的编号的变量
    ---根据会员号查处卡的编号
    select @cardId=cardid from cardinfo where cardNumber='c001'  
    ---向recordInfo表中插入一条记录信息,卡的编号、电脑编号和上机时间
     insert into recordInfo(cardId,PCId,beginTime) values(@cardId,1,getDate())
    ----查看结果
    select * from recordInfo
    select * from PCInfo

    update触发器示例

    ---创建delete触发器,在上网记录表RecordInfo上创建删除触发器
    create  trigger tr_delete_recordInfo
    on recordInfo
    for delete
    as
    
    if exists(select * from sysobjects where name='backRecordInfo')
      ----如果backrecordInfo表存在,就添加记录即可
      insert into backRecordInfo select * from deleted
    else
      ----创建backRecordInfo表,从deleted中获取被删除的数据
      select * into backRecordInfo from deleted
    print'backRecordInfo表备份数据成功,备份表中的数据为:'
       select * from backRecordInfo
    go
    -------关键代码------
    ----测试delete触发器,删除数据
    set nocount on
    delete from recordInfo
    ---查看结果
    print'记录表中的数据为:'
    select * from recordInfo

    elete触发器示例

    -------关键代码------
    create trigger tr_update_recordInfo
    on recordInfo
    for update
    as
    declare @beforePCId int
    declare @afterPCId int
    select @beforePCId =PCId from deleted
    select @afterPCId=PCID from inserted
    ---根据电脑编号修改使用状态-----
    ---根据以前使用的电脑编号把电脑的使用状态改为:
     update PCInfo set PCUse=0 where PCId=@beforePCId
    ---根据现在使用的电脑编号把电脑的使用状态改为:
     update PCInfo set PCUse=1 where PCId=@afterPCId
    ----显示电脑换机成功
    print'换机成功!从'+convert(varchar(10),@beforePCId)+'号电脑换到'+convert(varchar(10),@afterPCId)+'号电脑'
    go
    /*测试update触发器,修改电脑编号*/
    --显示更改前,记录表中的数据
    print'更改前,记录表中的数据'
    select * from recordInfo
    
    --显示更改前,电脑表中的数据
    print'更改前,电脑表中的数据'
    select * from PCInfo
    
    set nocount on
    ---把电脑号为1的改为2
    update recordInfo set PCId=2 where PCId=1  
    ---查看结果
    print'更改后,记录表中的数据'
    select * from recordInfo
    print'更改后,电脑表中的数据'
    select * from PCInfo

    instead of触发器的使用

    *instead of触发器的使用范围,instead of 触发器可以同时在数据表和视图中使用。通常在以下几种情况下,建议使用instead of触发器:
    *数据库里的数据禁止修改:例如电信部门的通话记录是不能修改的,一旦修改,则通话费用的计数将不准确。
    *有可能要回滚修改的SQL语句
    *在视图中使用触发器
    *用自己的方式去修改数据

    instead of触发器示例

    ---创建update触发器,在上网记录表recordInfo上创建修改(列)触发器
    create trigger tr_updateColum1_recordInfo
    on recordInfo
    instead of insert
    as
     declare @cardbalance int  --声明用于存储用户余额的变量
     declare @CardId int       --声明用于存储用户卡的编号的变量
     declare @PCId int         --声明用于存储电脑编号的变量
    ---inserted临时表中获取插入的记录行信息,包括电脑编号、卡的编号
    select @cardId=cardId,@PCId=PCId from inserted
    select @cardbalance=cardBalance from cardInfo where CardId=@CardId
    print'您的余额为:'+convert(varchar(10),@cardBalance) ---打印余额信息
    if(@cardBalance<2)    ---判断余额多少,看能否正常上机
    print'余额小于元,不能上机。请尽快充值!'
    else
    ----根据电脑的编号修改电脑的使用状态更改为正在使用
      update PCInfo set PCUse=1 where PCId=@PCId
    ----向recordInfo表插入上机记录
    insert into recordInfo(cardId,PCId,beginTime)values(@CardId,@PCId,getdate())
     print'上机成功'
    -------关键代码------
    set nocount on
    declare @cardId int  ---声明一个存储卡的编号的变量
    ---根据会员号查出卡的编号
    select @cardId=cardId from cardInfo where cardNumber='c001'
    ----向recordInfo表中插入一条记录信息,卡的编号、电脑的编号和上机时间
    insert into recordInfo(cardId,PCId,beginTime)values(@cardId,1,getdate())
    select * from recordInfo
    select * from PCInfo

     

     
  • 相关阅读:
    requests模块获取cookie和禁止重定向
    python 获取当前,上级,上上级路径
    jmeter正则表达提取器以及全局变量
    Linux性能监控软件netdata中文汉化版
    windows下搭建jenkins+allure+pytest
    Flask 重写wtforms验证器异常信息
    redis info 详解
    centos 安装setup命令的方法
    redis 配置
    linux 使用 vim 玩python
  • 原文地址:https://www.cnblogs.com/xiongzhuang/p/3076943.html
Copyright © 2020-2023  润新知