1.什么是触发器

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

2.创建触发器[DELETE, INSERT, UPDATE]

基本语法

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

3.实例

/*创建insert触发器,在上网记录表recordInfo上创建插入触发器*/
create trigger tr_insert_recordInfo        /*tr_insert_recordInfo 触发器名称*/
on recordInfo   
for insert  --insert操作时 触发器自动执行
 as
/*定义变量,用于临时存储插入的会员号、电脑编号和卡的编号*/
declare @cardId char(10)
declare @PCId int
declare @CardNumber char(10)

--insert进recordInfo表的数据 会临时存储在 临时表inserted表里面
/*从inserted临时表中获取插入的记录行的信息,包括电脑的编号、卡的编号,放在上面定义的变量里面*/ 
select @PCId=PCId,@cardId=CardId from inserted
---向PCInfo表中插入一条记录信息,卡的编号、电脑编号和上机时间
--从inserted表获取cardId,PCId,beginTime 插进PCInfo表
insert PCInfo (cardId,PCId,beginTime) select  cardId,PCId,beginTime from inserted
(或者 insert into PCInfo (cardId,PCId,beginTime) values(@cardId,1,getDate()))
----查看结果
select * from recordInfo
select * from PCInfo


/*创建update触发器,在上网记录表recordInfo上创建更新触发器*/
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


--删除同步

/*创建delete触发器,在上网记录表recordInfo上创建删除触发器*/

create trigger  tr_delete_recordInfo
on recordInfo

for delete
as
set xact_abort on
delete b
from recordInfo b,deleted i
where b.PCId= i.PCIdAND b.cardId=i.cardId
go

 

*如何删除触发器

drop trigger   tr_delete_recordInfo