触发器是当发生某个事件后自动的调用执行的特殊存储过程。
Sql server中的3类触发器
Insert:向数据表插入数据时,调用insert触发器。
Update:更新数据时调用update触发器。
Delete:删除数据时执行Delete触发器。
Sql server中这三类触发器总是在执行操作语句后才被自动调用。

三个虚拟表
Inserted表在执行插入语句时临时缓存数据值,通过触发器的判断之后才正式插入成功。
Updated表在更新数据是临时缓存数据值,功能同上。
Deleted表在删除数据是临时缓存数据值,功能同上。

Sql server中创建和使用触发器语法

Create trigger trigger_name----创建名称
On {table|view}----定义在表或者视图上
[with encryption]----加密元数据
{
{ {for|after|instead of}{[insert][,][update][,][delete]}触发器执行的条件
 [with append]
 [ont for replication]


As----触发器要执行的操作

[ {if update(column)----判断执行的是什么操作
 [{and|or}update(column)][,…n]
 |if(columns_updated(){bitwise_operator}updated_bitmask)----判断是否插入跟新了数据
 {comparison_operator}column[,…n]
}]
Sql_statement[,…n]操作语句
 }
}


for|after|instead of:for用于执行SQL语句时触发,after用于执行所有SQL语句后触发,instead of用于执行SQL语句前触发,替代执行SQL语句。
columns_updated():用以和后面updated_bitmask参数指定的字段进行位操作判断数据的插入和更新。
bitwise_operator:位操作符&,第1个字段为1,第2个字段为10,第2、3个字段为110,一次类推。
有以上语法可以看出触发器是基于表或者视图的,和存储过程的区别是:存储过程不依赖表或者视图,表的删除对存储过程不影响,而触发器会随着表或者视图的删除被删除。

使用insert触发器

举例:在向score表插入数据时,要求‘学号’字段必须在student表中存在,‘课号’必须在course表中存在。

create trigger trigger_insert
on score
for insert
as
declare @xuehao int,@kehao int
select @xuehao=学号,@kehao=课号
from inserted
if @xuehao not in(select 学号 from student)
begin
 rollback transaction
 print'学生表中不存在的学号,取消插入数据'
end
if @kehao not in(select 课号 from course)
begin
 rollback transaction
 print'成绩表中不存在的课号,取消插入数据'
end

效果截图:

sql server删除语句的触发器 sql server 删除触发器_数据

创建一个insert触发器

insert into score values('5','1','70')

效果截图:

sql server删除语句的触发器 sql server 删除触发器_触发器_02

插入不合法的数据验证insert触发器

使用update触发器
if(columns_updated(){bitwise_operator}updated_bitmask) 如果要实现同步更新另一个表中的数据,则可以使用这条语句判断。
举例:如果score表中的第3个字段‘成绩’被更新了,那么score表的第四个字段‘平均成绩’也同步更新。
这时候就需要使用这条查询语句做出判断if (columns_updated()&100)>0 begin…end
这只是对要查询是否更新的字段用二进制的1进行“+”运算,得出的结果>0则说明更新过了。

使用delete触发器
用于删除数据时自动调用,这和insert、update触发器是一个道理,区别只是不能使用if(columns_updated(){bitwise_operator}updated_bitmask)判断语句。

事件发生时的instead of触发器执行条件
instead of是用于在某个事件发生时替代insert、update、delete的操作,会执行触发器的内容,而不会再执行SQL语句。
instead of多是用于某些数据插入或者更新不能完成的情况下:
1. 数据值构造不一致的索引:
Create view view1 as
Select 姓名,区号+’-’+’电话号码’ as 联系方式  from student
举例:substring(联系方式,1,charindex(‘-’,联系方式)-1)
substring(联系方式, charindex(‘-’,联系方式)+1,datalength(联系方式))
利用函数substring()获取‘联系方式’中的区号和电话号码,分别插入数据表。

2. 使用条件插入数据库:如果插入的数据中有部分是不合法的,那么只执行合法的数据,将不合法的数据删除。
举例:比较正确的数据和刚刚更新的数据记录数量是否一样:查询的记录数<>@@rowcount,则需要将不合法的数据删除掉。