概念:
触发器是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作(Insert,delete,update)时就会激活它执行,触发器经常用于加强数据完整性约束和业务规则等。触发器可以从DBA_TRIGGers,USER_TRIGGERS数据字典种查到。
触发器和存储过程的区别:
触发器与存储过程的区别是运行方式的不同,触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行而存储过程需要用户,应用程序或者触发器来显示地调用并执行。
触法器的优点:
1.触发器是自动,当对表中的数据做了任何修改之后立即被激活。
2.触发器可以通过数据库中的相关表进行层叠修改。
3.触发器可以强制限制,这些限制比用CHECHK约束所定义的更复杂。与CHECHK约束不同的是触发器可以引用其他表中的列。
触发器的作用:
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性,它能够对数据库中的相关表进行级联修改,提高比CHECK约束更复杂的的数据完整性,并自定义错误消息。触发器的主要作用主要有以下接个方面:
1.强制数据库间的引用完整性
2.级联修改数据库中所有相关的表,自动触发其它与之相关的操作
3.跟踪变化,撤销或回滚违法操作,防止非法修改数据
4.返回自定义的错误消息,约束无法返回信息,而触发器可以
5.触发器可以调用更多的存储过程
触发器的工作原理:
1.系统自动在内存中创建deleted表或inserted表;
2.只读,不允许修改,触发器执行完成后,自动删除。
inserted表:
1.临时保存了插入或更新后的记录行;
2.可以从inserted表中检查插入的数据是否满足业务需求;
3.如果不满足,则向用户发送报告错误消息,并回滚插入操作。
deleted表:
1.临时保存了删除或更新前的记录行;
2.可以从deleted表中检查被删除的数据是否满足业务需求;
3.如果不满足,则向用户报告错误消息,并回滚插入操作
例如:创建insert触发器:
--创建一个触发器
create trigger trig_insert
--来自于那张表
on student
--什么操作
after insert
as
begin
if object_id(N‘student_sum‘,N‘U‘) is null--判断student_sum表是否存在
create table student_sum(stuCount int default(0));--创建存储学生人数的student_sum表
declare @stuNumber int;
select @stuNumber = count(*)from student;
if not exists (select * from student_sum)--判断表中是否有记录
insert into student_sum values(0);
update student_sum set stuCount =@stuNumber; --把更新后总的学生数插入到student_sum表中
end