SQL SERVER触发器

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 18:18 点击:

1、触发器触发时:
   a、系统自动在内存中创建deleted表或者inserted表
  b、只读,不允许修改;触发器执行完成后,自动删除
2、inserted表
a、临时保存了插入或更新后的记录行
b、可以从inserted表中检查插入的数据是否满足业务需求
c、如果不满足,则向用户报告消息错误,并回滚插入操作
3、deleted表
a、临时保存了删除或更新前的记录行
b、可以存deleted表中检查删除的数据是否满足业务
c、如果不满足,则向用户报告错误消息,并回滚插入操作
4、关于inserted与deleted表的说明

创建触发器的语法:
Create trigger trigger_name
on {table_name|view}
[with encryption]
{
{{FOR|AFTER|INSTEAD OF}{ [delete,insert,update] [ , ] [UPDATE]}
[WITH APPEND]
[NOT FOR REPLICATION]
AS
[  { IF UPDATE (column)  [{AND | OR} UPDATE (column)] |
IF (COLUMNS_UPDATED ())}]
t-sql语句
go
}
Table_name|view
是在其上执行触发器的表或视图,有时称触发器表或触发器视图。可以选择是否指定表或视图所有者的名称
with encryption表示加密触发器定义的sql文本
加密syscomments 表中包含Create trigger语句文本的条目,使用With Encryption可以防止将触发器作为SQL SERVER复制的一部分发布
AFTER
指定触发器只有在触发SQL语句中指定的所有操作都已成功后才激发,所有的应用级联操作和约束检查也必须完成后,才能执行次触发器。
如果仅指定FOR关键子,则AFTER是默认值。
不能再视图上定义AFTER触发器
INSTEAD OF
指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作
在表或视图上,每个INSERT、UPDATE或DELETE语句最多定义一个INSERT OF 触发器,然而可以在每个具有INSTEAD OF触发器的视图上定义视图。
INSERT OF触发器不能再WITH CHECK OPTION的可更新视图上定义,如果指向了WITH CHECK OPTION 选项的可更新视图添加INSERT OF触发器,SQL SERVER将产生一个错误,用户必须用Alter View删除该选项后才能定义INSTEAD OF 触发器.
{[delete] [,] [insert] [,] [update]}
是指定在表或视图上执行那些数据修改语句时将激活触发器的关键子,必须至少指定一个选项,在触发器定义中允许使用一任意顺序组合的这些关键字,如果指定的选项多于一个,需要逗号分隔这些选项。
对于INSERT OF触发器,不允许在具有ON DELETE级联操作引用关系的表上使用DELETE选项,同样,也不允许在具有ON UPDATE级联操作引用关系的表上使用UPDATE选项。
delete,insert,update指定触发器的类型
示例1、insert触发器
insert触发器的工作原理
 

问题:解决上述的银行取款问题,单向交易信息表(transinfo)中插入一条交易信息时,我们应自动更新对应账号的余额。
分析:
在交易表上创建insert触发器
从inserted临时表中获取插入的数据行
根据交易类型(Transtype)自动的值是存入/支取
增加/减少对应账号的余额
 
create trigger trig_transinfo
on transinfo
for insert
as
declare @type varchar(4),@outmoney money
declare @mycardid varchar(10), @balance money
select @type=transtype,@outmoney=transmoney,@mycardid=cardid from inserted
if(@type='支取')//根据交易类型,增加与减少卡号的余额
update bank set currentmoney=currentmoney-@outmoney where cardid=@mycardid
else
update bank set currentmoney=currentmoney+@outmoney where cardid=@mycardid
示例2、
create trigger trig_transInfo
on TTotal
for insert
as
declare @year varchar(100)
select @year=年份 from inserted
if(@year='2007')
rollback transaction
2、delete触发器
delete触发器的工作原理:
 

问题:单删除交易信息表时,要求自动备份被删除的数据到表的backuptable中
分析:
在交易信息表上创建delete触发器
被删除的数据可以从deleted表中获取
create trigger trig_delete_info
on transinfo
for delete
as
print '开始备份数据,请稍后.....'
if not exists(selec

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • sql常见面试题
    • SQL SERVER 2005性能之跟踪
    • SQL编程(一)
    • LINUX上RMAN自动备份脚本
    • sql server面试题
    • 如何将多个SQL查询统计结果一次显示出来
    • 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
    • SQL小技巧系列 --- 行转列合并
    • sql server 列转行
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1