什么是触发器?
  • 触发器是在对表进行插入、更新或删除操作时自动执行的存储过程
  • 触发器通常用于强制业务规则
  • 触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 :可执行复杂的SQL语句(if/while/case)、可引用其它表中的列
  • 触发器定义在特定的表上,与表相关。
  • 自动触发执行
  • 不能直接调用
  • 是一个事务(可回滚)
使用触发器的好处
触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。
触发器可以强制比用 CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用
其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,
如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。
触发器的类型
  • DELETE 触发器
  • INSERT 触发器
  • UPDATE 触发器
创建触发的语法
CREATE TRIGGER trigger_nameON 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 insertas
/*定义变量,用于临时存储插入的会员号、电脑编号和卡的编号*/
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
asif 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 PCInfoset 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
asdeclare @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

SQL Sever触发器的基本语法与作用相关推荐

  1. SQL Server触发器创建、删除、修改、查看

    http://blog.csdn.net/tianwailaibin/article/details/8111766 本教程为大家介绍SQL Server触发器创建.删除.修改.查看方法. 一.触发器 ...

  2. SQL Sever 2000中的前触发器和后触发器

    我们知道,触发器是一种特殊的存储过程.当Insert Update或Delete语句修改表中一个或者多个行时就会执行触发器.因为SQL Server对特定表上的每一个指定操作调用一个触发器,所以可以使 ...

  3. SQL sever数据库触发器设计

    SQL sever数据库触发器设计 一.目的: 能够理解触发器调用的机制. 能够使用SQL命令创建DML触发器. 能够完成触发器的修改.删除等管理任务. 二.触发器: 定义:触发器( T rigger ...

  4. sql sever 2008基础知识

    下面是一些总结,如果执行时发现错误,可以查看错误消息进行解决,也可上网查资料 数据库的组成: 主数据文件:有且只有一个,扩展名为.mdf. 次数据文件:可以没有,也可以有任意个.扩展名为.ndf. 日 ...

  5. SQL Server 触发器学习总结

    SQL菜鸟入门级教程之触发器 触发器简介:   触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,事件大家应该非常熟悉吧,比如按钮的Click事件 ...

  6. mysql 触发器 sql server_喜忧参半的SQL Server触发器

    SQL Server触发器在非常有争议的主题.它们能以较低的成本提供便利,但经常被开发人员.DBA误用,导致性能瓶颈或维护性挑战. 本文简要回顾了触发器,并深入讨论了如何有效地使用触发器,以及何时触发 ...

  7. SQL Sever 2012

    SQL Sever 2012[未完待续] 文章目录 SQL Sever 2012[未完待续] 数据库组成 系统数据库 创建数据库的方法 数据库常用对象 表 字段(表中的列) 字段(列)的数据类型[*重 ...

  8. oracle触发器报错语法,Oracle 触发器

    Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码,叫做触发器.触发的事件包括对表的DML操作,用户的DDL操作以及数据库事件等. 一.触发器的作用 O ...

  9. pl/sql编程----触发器

    触发器 (trigger) 触发器指隐含的执行的存储过程,既当特定事件出现时自动执行的存储过程. 当定义触发器时,必须要指定触发的事件和触发的操作,常用的触发事件包括insert,update,del ...

最新文章

  1. 【SVN】linux下svn命令参数详解(二)
  2. C语言实现长整数连加,二个超长正整数的相加
  3. 第五章:系统困境之 你的努力忽略了关键限制因素
  4. debian9 没有ipv4
  5. Windows 7技巧之Telnet组件消失之迷
  6. 文件 单片机_如何查看你写的单片机程序有多大?
  7. socket异步处理问题
  8. 弹出界面eth0/eth1错误 激活连接失败 master connection not found or invalid 解决办法
  9. python里hist图状图_直方图中具有阶梯填充histtype的matplotlib散点图hist
  10. Angr安装与使用之使用篇(十)
  11. Android校准指南针,电子罗盘的工作原理及校准 电子罗盘,电子指南针,android.docx...
  12. 含泪整理最优质QuickTime软件插件素材,你想要的这里都有
  13. 学习Python比较好的书籍推荐
  14. SpringSecurity实战(七)-对接第三方登陆-流程分析
  15. uniapp 微信小程序 map获取接口数据后地图标注marker不会渲染显示
  16. 统计正交码片(c++)
  17. 手机浏览器能接收彩信,还hold住吗?
  18. Python数据分析——上海市二手房价格分析
  19. Arcpy 通过mxd模版生成专题图
  20. M2E插件maven-dependency-plugin问题

热门文章

  1. 绿盟安全扫描前端出现邮箱地址风险的处理方法
  2. 新加坡出差记之一 --准备篇
  3. 【Vmware】vSphere Client上传不了镜像
  4. STM32建立固件库小结
  5. 北京交大计算机专业导师,北京交通大学教师名录
  6. 《移动通信原理与系统》——第1章- 概述
  7. 微信支付退款证书下载与安装及其注意事项
  8. html 中 img 对连接的释放
  9. 入坑GPU云平台【个人感受】
  10. TOR下载和网桥配置教程