SQLServer中的触发器基本语法与作⽤
什么是触发器?
触发器是在对表进⾏插⼊、更新或删除操作时⾃动执⾏的存储过程。触发器对表进⾏插⼊、更新、删除的时候会⾃动执⾏的特殊存储过程。触发器⼀般⽤在check约束更加复杂的约束上⾯。触发器和普通的存储过程的区别是:触发器是当对某⼀个表进⾏操作。诸如:update、insert、delete这些操作的时候,系统会⾃动调⽤执⾏该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语⾔语句⽽激发,这些语句有create、alter、drop语句。
SQL Server为每个触发器都创建了两个专⽤表﹕Inserted表和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_name
ON 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 insert
as
/*定义变量,⽤于临时存储插⼊的会员号、电脑编号和卡的编号*/
declare @cardId char()
declare @PCId int
declare @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 recordInfo
select * from PCInfo
update触发器⽰例
---创建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
delete触发器⽰例
-------关键代码------
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= where PCId=@beforePCId
sql触发器的使用---根据现在使⽤的电脑编号把电脑的使⽤状态改为:
update PCInfo set PCUse= where PCId=@afterPCId
----显⽰电脑换机成功
print'换机成功!从'+convert(varchar(),@beforePCId)+'号电脑换到'+convert(varchar(),@afterPCId)+'号电脑'
go
/*测试update触发器,修改电脑编号*/
--显⽰更改前,记录表中的数据
print'更改前,记录表中的数据'
select * from recordInfo
--显⽰更改前,电脑表中的数据
print'更改前,电脑表中的数据'
select * from PCInfo
set nocount on
---把电脑号为的改为
update recordInfo set PCId= where PCId=
---查看结果
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
as
declare @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
以上所述是⼩编给⼤家介绍的SQLSever中的触发器基本语法与作⽤的相关内容,希望对⼤家有所帮助!