SQL SERVER 7触发器(一)

2014-11-24 13:24:01 · 作者: · 浏览: 0
SQL SERVER 7触发器
1、什么是触发器
触发器是在对表进行插入、更新或删除操作时自动执行的存储过程
触发器通常用于强制业务规则
触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 :可执行复杂的SQL语句(if/while/case)、可引用其它表中的列
触发器定义在特定的表上,与表相关。
自动触发执行
不能直接调用
是一个事务(可回滚)
2、触发器的类型
DELETE 触发器
INSERT 触发器
UPDATE 触发器
3、inserted 和deleted 表
触发器触发时:
系统自动在内存中创建deleted表或inserted表
只读,不允许修改;触发器执行完成后,自动删除。
inserted 表
临时保存了插入或更新后的记录行
可以从inserted表中检查插入的数据是否满足业务需求
如果不满足,则向用户报告错误消息,并回滚插入操作
deleted 表:
临时保存了删除或更新前的记录行
可以从deleted表中检查被删除的数据是否满足业务需求
如果不满足,则向用户报告错误消息,并回滚插入操作
inserted表和deleted表存放的信息。
修改操作
inserted表
deleted表
增加(INSERT)记录
存放新增的记录
------
删除(DELETE)记录
-----
存放被删除的记录
修改(UPDATE)记录
存放更新后的记录
存放更新前的记录
4、如何创建触发器
创建触发器的语法
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR [DELETE, INSERT, UPDATE]
AS
T-SQL语句
GO
WITH ENCRYPTION表示加密触发器定义的SQL文本
DELETE, INSERT, UPDATE指定触发器的类型
INSERT 触发器示例
问题:
当会员号为001上机时:向记录信息表(recordInfo)中插入一条上机信息时,我们应根据电脑的编号自动更新电脑的使用状态。
分析:
在记录信息表上创建INSERT触发器
从inserted临时表中获取插入的数据行
根据电脑编号(PCId)修改电脑状态是否为使用状态,修改电脑状态。
/*创建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
DELETE触发器示例
问题:
当删除记录表时,要求自动备份被删除的数据到表backRecordInfo中 。
分析:
在记录表上创建DELETE触发器
被删除的数据可以从deleted表中获取
---创建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
UPDATE触发器示例
问题:
在网吧计费系统中,有时我们需要对电脑进行换机操作,这样我们就要更新recordInfo(记录表)中的上机记录。
分析:
当一台电脑空闲时