侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

SQLSever中的触发器基本语法与作用

数据库  /  管理员 发布于 5年前   225

什么是触发器?

触发器是在对表进行插入、更新或删除操作时自动执行的存储过程。 触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。

SQL Server为每个触发器都创建了两个专用表sInserted表和Deleted表。

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

触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 :可执行复杂的SQL语句(if/while/case)、可引用其它

表中的列

触发器定义在特定的表上,与表相关。

自动触发执行

不能直接调用

是一个事务(可回滚)使用触发器的好处触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。

DML触发器分为:

1、 after触发器(之后触发)

a、 insert触发器

b、 update触发器

c、 delete触发器

UPDATE 触发器创建触发的语法

CREATE TRIGGER trigger_nameON table_name[WITH ENCRYPTION]FOR [DELETE, INSERT, UPDATE]AST-SQL语句GO

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

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

update触发器示例

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

delete触发器示例

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

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

---创建update触发器,在上网记录表recordInfo上创建修改(列)触发器create trigger tr_updateColum1_recordInfoon recordInfoinstead of insertasdeclare @cardbalance int --声明用于存储用户余额的变量declare @CardId int --声明用于存储用户卡的编号的变量declare @PCId int --声明用于存储电脑编号的变量---inserted临时表中获取插入的记录行信息,包括电脑编号、卡的编号select @cardId=cardId,@PCId=PCId from insertedselect @cardbalance=cardBalance from cardInfo where CardId=@CardIdprint'您的余额为:'+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 ondeclare @cardId int ---声明一个存储卡的编号的变量---根据会员号查出卡的编号select @cardId=cardId from cardInfo where cardNumber='c001'----向recordInfo表中插入一条记录信息,卡的编号、电脑的编号和上机时间insert into recordInfo(cardId,PCId,beginTime)values(@cardId,1,getdate())select * from recordInfoselect * from PCInfo

以上所述是小编给大家介绍的SQLSever中的触发器基本语法与作用的相关内容,希望对大家有所帮助!


  • 上一条:
    SQL Server阻止保存修改表结构的解决方法
    下一条:
    SQLserver2014(ForAlwaysOn)安装图文教程
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客