【数据库】数据库视频总结(九)
第十章 触发器
目录
定义
一个在修改指定表中的数据时执行的存储过程。通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性或一致性。
触发器主要通过事件进行触发而被执行,而存储过程可以通过存储过程名字被直接调用。
优点
自动执行;可以通过数据库中的相关表进行层叠更改;可以强制限制,比check约束更应具有约束力。
种类
DDL触发器:当服务器或者数据库中发生数据定义语句DDL事件时将被调用。
DML触发器:当数据库服务器中发生数据操作语句DML事件时要执行的操作。
Insert update delete 都属于DML触发器,它是对某一个数据表的某一个数据操作语句进行触发的种类。
两种触发器存在的位置是不同的,DML存在数据表下,DML是针对于数据库的触发器,存在数据库中。
操作
创建insert触发器
语法格式:
实例:创建触发器,执行插入操作时被触发。
--创建一个新的触发器
create trigger T_addnum
on 学生信息
for insert
as
update 班级信息 set 班级人数=班级人数+1
where 班级编号 =(select 所属班级 from inserted)
--进行查询
select 班级人数 from 班级信息 where 班级编号='120'
insert into 学生信息 values('150','章','女','2011-02-02','1','15631670968','2019-02-02','1112','21222')
select 班级人数 from 班级信息 where 班级编号='120'
创建delete触发器
实例:创建一个delete触发器,当执行删除操作时,会引发触发器。
--创建触发器
create trigger T_deleteacher
on course_Info
for delete
as
--当删除了信息之后,会提示
select course_No as 被删除的记录 ,course_No,course_Name,course_Type from deleted
--进行删除操作
delete from course_Info where course_No='12302'
--查询结果
select * from course_Info
创建update触发器
--定义一个触发器,不允许更改记录,当更改记录时,会有提示。
create trigger t_update
on student_Info
for update
as
--判断是否更改记录,返回不同的结果。
if (update(student_ID) or update (student_Name))
begin
print '事务不能被处理,基础数据不可以修改!'
rollback transaction
end
else
print '数据修改成功!'
--触发存储过程
update student_Info set student_Name ='laur ' where student_ID='180'
--显示事务不能被处理,触发器已经触发。
select * from student_Info
--或者是
update student_Info set student_Sex ='男' where student_ID='180'
select * from student_Info
--记录已经修改完成,可以查询到结果。
创建DDL触发器
语法格式:
实例:
实例:
create trigger T_notdelete
on database
for drop_table,alter_table
as
print '事务不能被处理,基础数据表不能被修改和删除!'
rollback
--以上创建了一个触发器,不允许当前数据被操作
--使用drop语句,删除具体的数据表
drop table student_Info
--显示事务不能被处理。
管理触发器
修改,删除,启用,禁用。
通过具体的操作命令。
通过命令菜单可以查看触发器的创建语句,可以简单微调进行调整,调整完成后直接进行执行就可以。
如果想要本次的操作不能触发,可以选择禁用这个触发器,之后可以选择启用。
--更新数据表时,禁用触发器
alter table course_Info
disable trigger T_deleteacher
--启用触发器
alter table course_Info
enable trigger T_deleteacher
--删除触发器
drop trigger T_addnum
嵌套触发器
修改另外一个表时可能会触发另外一个触发器,防止这种情况,需要嵌套触发器。
最多可以嵌套32层
实例:
create trigger t_del
on 新员工信息
fro delete
as
insert into 员工信息(员工编号,员工姓名,所在部门编号,所任职位,性别)
select 员工编号,员工姓名,所在部门编号,所任职位,性别
from delectd
--创建第二个触发器 更新当前员工的人数
create trigger t_acd
on 员工信息
for insert
as
update 部门信息 set 员工人数=员工人数+1
where 部门编号=(select 所在部门编号 from inserted)
--删除记录
delete from 新员工信息 where 员工编号=14--进行删除操作,触发删除触发器
select 员工人数 from 部门信息 where 部门编号='10010' --执行插入操作,会触发本表上的插入触发器。
递归触发器
任何触发器都可以包含影响同一个表或者是另一个表的update insert delete语句。如果启用递归触发器,改变表中数据的触发器,通过递归执行可以再次触发自己。在数据库创建时,默认情况下递归触发器选项是禁用的,可以通过alter database语句(或者是操作界面)来启用。
操作:数据库-属性-选项-杂项-递归触发器已启用-true
注意事项:
1、必须经过有条理的设计和全面的测试
2、在任一点的数据修改会触发一系列触发器,如果表要求已特定的顺序更新用户的表时,使用递归触发器会产生问题。
3、所有触发器一起构成一个大事务。如何触发器中的任何位置上的rollback命令都将取消所有的数据输入。
4、触发器最多递归16层。
感谢您的阅读,欢迎斧正~
文章来源: blog.csdn.net,作者:张艳伟_Laura,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Laura__zhang/article/details/103327979
- 点赞
- 收藏
- 关注作者
评论(0)