触发器是一种特殊类型的存储过程,与我们之前介绍的存储过程不同。触发器由事件触发,并自动调用和执行。可以通过存储过程的名称来调用存储过程。本文介绍了SQLServer中触发器的基本语法和功能。和感兴趣的朋友一起学习吧。
什么是触发器?
触发器是在插入、更新或删除表时自动执行的存储过程。当触发器插入、更新或删除表时自动执行的特殊存储过程。触发器通常用于检查更复杂的约束。触发器与普通存储过程的区别在于触发器是在操作一个表时触发的。当进行更新、插入、删除等操作时,系统会自动调用并执行相应的表上触发器。SQL Server 2005中的触发器可以分为两种:DML触发器和DDL触发器,其中DDL触发器可以通过影响各种数据定义语言语句来触发,如create、alter和drop语句。
SQL Server为每个触发器创建两个专用表:插入的表和删除的表。
触发器通常用于实施业务规则。
Trigger是一个高级约束,可以定义比CHECK约束更复杂的约束:可以执行复杂的SQL语句(if/while/case),可以引用other。
表格中的列
触发器是在特定的表上定义的,并且与表相关。
自动触发器执行
不能直接调用。
是事务(可滚动的)使用触发器的好处触发器可以通过数据库中的相关表级联更改,但是,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK约束定义的约束更复杂的约束。与CHECK约束不同,触发器可以引用其他表中的列。例如,触发器可以使用另一个表中的SELECT来比较插入或更新的数据,并执行其他操作,如修改数据或显示用户定义的错误消息。触发器还可以评估数据修改前后的表状态,并根据它们的差异采取对策。表中相同类型的多个触发器(INSERT、UPDATE或DELETE)允许采取多种不同的对策来响应相同的修改语句。
DML触发器分为:
1.触发后(稍后触发)
一、插入触发器
b、更新触发器
删除触发器
UPDATE 触发器创建触发的语法
创建触发器trigger_name
在表名上
[带加密]
用于[删除、插入、更新]
如同
T-SQL语句
去
注意:WITH ENCRYPTION表示SQL文本删除、插入、更新加密触发器定义,它指定了触发器的类型。插入触发器示例
/*创建插入触发器,并在联机记录表recordInfo上创建插入触发器*/
创建触发器tr_insert_recordInfo
在记录信息上
用于插入
如同
/*定义变量来临时存储插入的会员号、电脑号和卡号*/
declare @cardId char()
声明@PCId int
声明@CardNumber char()
/*从插入的临时表中获取插入的记录行的信息,包括电脑号和卡号*/
select @PCId=PCId,@cardId=CardId from inserted
/*根据电脑编号修改电脑的使用状态*/
更新PCInfo set PCUse=where PCId=@PCId
/*根据卡号核对会员号*/
select @ card number=card number from card info其中CardId=@cardid
/*显示计算机操作成功的信息*/
成功打印计算机!成员号是 @CardNumber ,机器号是 convert(char(),@PCId
去
-插入测试数据,并使用具有会员编号的计算机。
Set nocount on -不显示受sql语句影响的记录行数。
declare @ car dint-一个声明存储卡号的变量。
-根据会员号查处卡号。
select @ cardId=cardId from card info where card number= c
-在recordInfo表中插入一条记录信息,包括卡号、计算机号和计算机时间。
插入recordInfo(cardId,PCId,beginTime)值(@cardId,getDate())
-检查结果。
select * from recordInfo
select * from PCInfo
update触发器示例
-创建删除触发器,并在联机记录表RecordInfo上创建删除触发器。
创建触发器tr_delete_recordInfo
在记录信息上
用于删除
如同
如果存在(select * from sysobjects,其中name=backRecordInfo )
-如果backrecordInfo表存在,只需添加记录。
插入到backRecordInfo select * from deleted
其他
-创建backRecordInfo表,并从deleted中获取已删除的数据。
select * into backRecordInfo from deleted
打印 backRecordInfo表数据备份成功,备份表中的数据为:
select * from backRecordInfo
去
-关键代码
-测试删除触发器以删除数据。
设置nocount on
从记录信息中删除
-检查结果。
打印记录表中的数据是:
select * from recordInfo
delete触发器示例
-关键代码
创建触发器tr_update_recordInfo
在记录信息上
用于更新
如同
声明@beforePCId int
声明@afterPCId int
select @ before PCId=PCId from deleted
从inserted中选择@afterPCId=PCID
-根据计算机号修改使用状态-
-根据之前使用的计算机编号,将计算机的使用状态更改为:
更新PC info set PCUse=where PCId=@ before PCId
-将计算机的使用状态更改为:
更新PC info set PCUse=where PCId=@ after PCId
-显示计算机已成功更改。
打印‘换机成功!从“convert(varchar(),@beforePCId)”计算机更改为“convert(varchar(),@afterPCId)“计算机”
去
/*测试更新触发器并修改计算机号*/
-在显示更改之前,记录表格中的数据。
打印“更改前,记录表格中的数据”
select * from recordInfo
-显示更改前计算机表中的数据。
打印“更改前计算机表中的数据”
select * from PCInfo
设置nocount on
-将计算机号更改为
更新记录信息集PCId=其中PCId=
-检查结果。
打印“记录更改后表格中的数据”
select * from recordInfo
打印“更改后计算机表中的数据”
select * from PCInfo
使用instead of触发器instead of触发器范围,instead of触发器可以在数据表和视图中使用。通常在以下情况下建议使用instead of trigger:数据库中的数据禁止修改:比如电信部门的通话记录不能修改,一旦修改会导致通话费用统计不准确。可以回滚修改后的SQL语句,并在视图中使用触发器以自己的方式修改数据,而不是使用触发器示例。
-创建一个更新触发器,并在联机记录表recordInfo上创建一个修改(列)触发器。
创建触发器tr _ updateColum1 _ recordInfo
在记录信息上
代替插入
如同
Declare @ cardbalanceint-声明用于存储用户余额的变量。
Declare @ cardint——声明用于存储用户卡号码的变量
Declare @ pcint-声明用于存储计算机号的变量
-获取插入的临时表中插入的记录行信息,包括计算机号和卡号。
select @cardId=cardId,@PCId=PCId from inserted
select @ card balance=card balance from card info其中CardId=@CardId
Print 您的余额是: convert (varchar (10),@ card balance)-打印余额信息。
if(@ cardbalance 2)-判断余额多少,看能不能正常使用。
打印余额小于人民币,不能使用。请尽快充值!”
其他
-根据计算机的编号,将计算机的使用状态修改为正在使用。
更新PCInfo set PCUse=1,其中PCId=@PCId
-将计算机记录插入recordInfo表中。
插入recordInfo(cardId,PCId,beginTime)值(@CardId,@PCId,getdate())
打印“计算机成功”
-关键代码
设置nocount on
declare @ car dint-一个声明存储卡号的变量。
-根据会员号找出卡号。
select @ cardId=cardId from card info where card number= c001
-在recordInfo表中插入一条记录信息,包括卡号、计算机号和计算机时间。
插入recordInfo(cardId,PCId,beginTime)值(@cardId,1,getdate())
select * from recordInfo
select * from PCInfo
以上是边肖介绍的SQLSever中触发器的基本语法和功能。希望对你有帮助!