1.触发器:一个在修改指定表中的数据时执行的存储过程。用于实现不同表中的逻辑相关数据的引用完整性或一致性。
自动执行,表的数据修改后立即激活
通过数据库中的相关表进行层叠更改
可以强制限制,引用其他表中的列,其限制比用CHECK约束更复杂。
3.1 DDL(数据定义语言)触发器:
防止数据库架构进行某些更改;
数据库中发生某种情况以相应数据库架构中的更改;
记录数据架构中的更改或者事件可以使用DDL触发器;3.2 DML(数据操作语言)触发器:INSERT\UPDATE\DELETE触发器
4.触发器的创建:
4.1 创建INSERT触发器:
create trigger T_addnum
on 学生信息
for insert
as
update 班级信息 set 班级人数=班级人数+1
where 班级编号=(select 所属班级 from inserted)
执行触发器,在学生信息表中插入一条记录:
SELECT 班级人数 from 班级信息 where 班级编号='20050101'
insert into 学生信息 value('2009010101','王俊','男','1986-08-09','汉族','20050101','北京')
SELECT 班级人数 from 班级信息 where 班级编号='20050101'
执行结果:班级人数+1。
4.2 创建DELETE触发器:(数据表中进行数据删除时,触发DELETE触发器)
CREATE TRIGGER T_DELETETEACHER
ON 教师信息
FOR DELETE
AS
SELECT 姓名 AS 被删除的教师姓名,性别,年龄,联系电话 FROM DELETED(临时表)
执行触发器,删除一个教师信息
DELETE FROM 教师信息 where 教师编号='2005001'
SELECT * FROM 教师信息
4.3 创建UPDATE触发器:更改教师姓名,提示更改操作错误,不提交姓名更改,如果是年龄或籍贯,显示更改成功。
CREATE TRIGGER t_UPDATE
ON 教师信息
for update
as
if (update(姓名) or update(性别))
begin
print '事物不能被处理,基础数据不能被修改!'
ROLLBACK TRANSACTION'事物关键字
end
else
print '数据修改成功!'
修改信息:
UPDATE 教师信息 set 姓名='李芳' where 教师编号='20050010'
SELECT * from 教师信息
执行结果:事物不能被处理,基础数据不能修改!
UPDATE 教师信息 set 联系电话='13598854445' where 教师编号='20050010'
SELECT * from 教师信息
执行结果:数据修改成功!
4.4 创建DDL触发器:
create trigger T_notdelete
on database '对当前数据库创建触发器
for Drop_table,alter_table
AS
PRINT '事物不能被处理,基础数据表不能被修改或删除!'
ROLLBACK '取消所有数据输入
创建DDL触发器后,针对当前数据库,就可以在数据库触发器里面可以找到命为T_notdelete的触发器
删除一个数据表:
drop table student结果:事物不能被处理,基础数据表不能被修改或删除!
5.管理触发器:
找到触发器-右击-修改、禁用、启用
禁用触发器代码:
alter table 员工信息
disable trigger t_add
alter table 员工信息
enable trigger t_add
drop trigger t_add
6.嵌套触发器:最多可以嵌套32层
针对两个表,新员工信息(试用期员工)、员工信息,定义两个触发器:
create trigger t_del
on 新员工信息
for delete
as
insert into 员工信息(员工编号,员工姓名,所在部门编号,所任职位,性别)
select 员工编号,员工姓名,所在部门编号,所任职位,性别
from deleted
create trigger t_add
on 员工信息表
for insert
as
update 部门信息 set 员工人数=员工人数+1
where 部门编号=(select 所在部门编号 from inserted)
delete from 新员工信息 where 员工编号=14
select 员工人数 from 部门信息 where 部门编号='10001'
结果:“行受影响”出现3行,表明该触发器对三个表进行操作。
再执行,员工人数结果为6。
分析:试用期员工转正首先要对新员工信息表进行删除操作,触发DELETE触发器,然后将该新员工的信息加入到员工信息表征,即对员工信息表进行INSERT操作,触发insert触发器,最后对部门信息表形成触发器嵌套,修改部门人数,员工人数。
7.递归触发器:任何触发器都可以包含影响同一个表或另一个表的UPDATE、INSERT、或DELETE语句。如果启用递归触发器选项,那么改变表中数据的触发器,通过递归执行就可以再次触发自己。
在数据库创建时,默认其情况下递归触发亲选项是禁用的,但是可以使用ALTER DATABASE语句来启用它,也可以在操作环境中启用递归触发器:数据库属性-选项-杂项-递归触发器已启用变为True。递归触发器最多可达16层。