个人主页: :✨✨✨初阶牛✨✨✨
推荐专栏1: C语言初阶
推荐专栏2: C语言进阶
个人信条: 知行合一
本篇简介:>记录SQL server触发器的创建语句,以及简单介绍.
前言
目录
- 前言
- 一、触发器的介绍
- 1.1 触发器 的概念以及定义:
- 1.2 、 触发器 的作用
- 二、使用SQL语句创建触发器实例
- 1.创建`after`融发器
- 2.创建`instead of`触发器
一、触发器的介绍
1.1 触发器 的概念以及定义:
触发器 是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。存储过程可以通过语句直接调用,而 触发器主要是通过事件进行触发而被执行的.
例如当对某一表进行诸如UPDATE
(修改)、INSERT
(插入)、DELETE
(删除)这些操作时,SQL Server 就会自动执行触发器所定义的SQL
语句,从而确保对数据之间的相互关系,实时更新.
1.2 、 触发器 的作用
触发器的主要作用就是其能够实现由 主键 和 外键 所不能保证的复杂的参照完整性和数据的一致性。除此之外, 触发器 还有其它许多不同的功能:
①、复杂的约束条件
触发器 能够实现比CHECK 语句更为复杂的约束。
②、保证数据的安全
触发器 因为 触发器是在对数据库进行相应的操作而自动被触发的SQL
语句可以通过数据库内的操作从而不允许数据库中未经许可的指定更新和变化。
③.级联式
触发器 可以根据数据库内的操作,并自动地级联影响整个数据库的各项内容。例如:对A
表进行操作时,导致A
表上的 触发器被触发,A
中的 触发器中包含有对B
表的数据操作(UPDATE
(修改)、INSERT
(插入)、DELETE
(删除)),而该操作又导致B表上 触发器被触发。
④.调用存储过程
为了响应数据库更新, 触发器 可以调用一个或多个存储过程.
但是,总体而言, 触发器性能通常比较低。
三、 触发器 的种类
SQL Server
中一般支持以下两种类型的触发器:
AFTER
触发器
AFTER
触发器 要求只有执行某一操作(INSERT、UPDATE、DELETE)之后, 触发器 才被触发,且只能在表上定义。可以为针对表的同一操作定义多个 触发器 。
2. INSTEAD OF
触发器 。
INSTEAD OF
触发器 表示并不执行其所定义的操作(INSERT、UPDATE、DELETE),而仅是执行 触发器 本身。既可在表上定义INSTEAD OF 触发器 ,也可以在视图上定义INSTEAD OF 触发器 ,但对同一操作只能定义一个INSTEAD OF 触发器 。
二、使用SQL语句创建触发器实例
1.创建after
融发器
(1)创建一个在插入时触发的触发器sc_insert
,当向sc
表插入数据时,须确保插入的学号已在student
表中存在,并且还须确保插入的课程号在Course
表中存在﹔若不存在,则给出相应的提示信息,并取消插入操作,提示信息要求指明插入信息是学号不满足条件还是课程号不满足条件(注:Student表与sc表的外键约束要先取消)。
语句实现:
create trigger sc_inserton scafter insertasif not exists (select * from student,insertedwhere student.sno=inserted.sno)beginprint '插入信息的学号不在学生表中! 'if not exists (select * from course,inserted wherecourse.cno=inserted. cno)print '插入信息的课程号不在课程表中!'rollbackendelsebeginif not exists (select * from course,inserted whereCourse.cno=inserted.cno)beginprint '插入信息的课程号不在课程表中! 'rollbackendend
执行:
insert into scvalues ( '20110112','001','78')
删除外键约束;
alter table scdrop constraint FK_sc__sno__332C9D34
(2)为Course
表创建一个触发器Course_del
,当删除了Course
表中的一条课程信息时,同时将表sc
表中相应的学生选课记录删除掉。
create trigger course_delon courseafter deleteasif exists(select * from sc, deletedwhere sc.cno=deleted.cno)begindelete from scwhere sc.cno in (select cno from deleted)enddelete from Coursewhere Cno='003'
select * from sc
(3)在Course
表中添加一个平均成绩avg_Grade
字段(记录每门课程的平均成绩),创建一个触发器Grade_modify
,当sc
表中的某学生的成绩发生变化时,则Course
表中的平均成绩也能及时相应的发生改变。
向Course
表中添加一个平均成绩avg_Grade
字段
alter table Courseadd avg_Grade smallint
向avg_Grade
中添加数据
update courseset avg_Grade= (select AVG(Grade) from scwhere sc.Cno=Course.Cno)
查看Course
表:
select *from Course
创建Grade_modify
触发器
create trigger Grade_modifyon scafter updateasif update(grade)beginupdate courseset avg_grade=(select avg (grade)from sc where course.cno=sc.cnogroup by cno)endupdate scset Grade='90 'where sno='20050001' and cno='001'
2.创建instead of
触发器
(1)创建一视图Student_view
,包含学号、姓名、课程号、课程名、成绩等属性,在Student_view
上创建一个触发器Grade_moidfy
,当对Student_view
中的学生的成绩进行修改时,实际修改的是sc中的相应记录。
创建视图:
create view student_viewasselect s.Sno,Sname , c.Cno , Cname , Gradefrom student s , course c, scwhere s.Sno=sc.sno and c.Cno=sc.cno
创建触发器:
create trigger Grade_moidfy on student_viewinstead of updateasif UPDATE (Grade)beginupdate scset Grade= (select Grade from inserted) whereSno= (select sno from inserted) and Cno= (select Cno from inserted)Endupdate student_viewset Grade=40where Sno='20110001'and Cno='002'
测试修改数据:
select *from student_view
(2)在sc
表中插入一个getcredit
字段(记录某学生,所选课程所获学分的情况),创建一个触发器ins_credit
,当更改(注:含插入时)sc
表中的学生成绩时,如果新成绩大于等于60分,则该生可获得这门课的学分,且该学分须与Course
表中的值一致﹔如果新成绩小于60分,则该生未能获得学分,修改值为0。
添加新字段getcredit
:
alter table scadd getcredit smallint
创建触发器:
create trigger sc_upon scafter insert,updateasdeclare @xf int,@kch char(3),@xh char(8),@fs intselect @fs=grade,@kch=cno,@xh=sno from insertedif @fs>=60update sc set @xf=(select credit from course wheresc.Cno=course.cno) where sno=@xh and cno=@kchelseupdate sc set @xf=0 where sno=@xh and cno=@kch修改数据:update scset Grade='90'where Sno='20050001' and cno='001'
以上就是对触发器的基本认识了,希望对大家有所帮助.
欢迎友友们私信与牛牛讨论问题.,只是牛牛的认知范围有限,目前只关注c语言,数据结构,C++等部分领域.