触发器.docx
- 文档编号:26148352
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:13
- 大小:84.88KB
触发器.docx
《触发器.docx》由会员分享,可在线阅读,更多相关《触发器.docx(13页珍藏版)》请在冰豆网上搜索。
触发器
实验评讲:
1、创建一个存储过程,求两个变量的最大值,并返回其结果,要求两个变量为输入参数,最大值为输出参数。
分析:
存储过程,两个输入参数,一个输出参数,存储过程内容:
求两个变量的最大值
两个输入参数:
@a,@b
输出参数:
@max
求两个变量的最大值:
if@a>@b
set@max=@a
else
set@max=@b
格式:
createproc存储过程的名称
@输入参数1数据类型和长度,
。
。
。
@输入参数n数据类型和长度,
@输出参数数据类型和长度output
as
存储过程内容
代入格式:
createprocp_max
@aint,
@bint,
@maxintoutput
as
if@a>@b
set@max=@a
else
set@max=@b
go
declare@maxint
execp_max'112','28',@maxoutput
print@max
-----------------学生作品注意看红色标示-----------
createprocp_max0
@aint,--多个参数,必须加上,
@bint,
@maxintoutput
as
declare@aint—已作为输入参数,不能再定义
declare@bint—已作为输入参数,不能再定义
declare@mint—已作为输入参数,不能再定义
set@a=1–-已作为输入参数,不需要赋值,在exec执行时,再给出值
set@b=2–-已作为输入参数,不需要赋值,在exec执行时,再给出值
--比较ab两个数的的最大值
if(@a>@B)
set@m=@a
else
set@m=@b
go—-创建存储过程与执行存储过程要分开
declare@maxint--输出参数,必须重新定义
execp_max'112','28',@maxoutput
print@max–-结果显示
----------------------------------------
2、创建一个存储过程,计算2+4+6+。
。
。
+n的和,要求n为输入参数,求和为输出参数。
3、课本P146思考与练习
(1)
(2)
createprocP_Course1
@cnochar(3),
@cnamechar(10),
@ccreditint
as
ifexists(select*fromcoursewherecno=@cno)
print'该课程已经存在!
'
else
insertintocourse(cno,cname,ccredit)
values(@cno,@cname,@ccredit)
execP_course1'1','电子商务',3
select*fromcours
4、创建一个insert触发器,当用户给sc表插入数据时,在另外一个表中生成该表数据的副本
5、创建一个触发器,删除学生的信息之后,相应的选课信息也应删除
分析:
题意:
在学生表中删除…之后,相应的….也删除
在学生表:
onstudent
删除…之后:
afterdelete
相应的….也删除:
触发器的内容,也就是说,as后面的语句
格式:
CREATETRIGGER触发器的名称
ON表
Afterinsert/update/delete
As
SQL语句
代入格式:
createtriggertri_d
onstudent
afterdelete
as
declare@snochar(10)
select@sno=snofromdeleted
deletefromscwheresno=@sno
测试:
deletefromstudentwheresno='1111'
查看结果:
select*fromstudentwheresno='1111'
select*fromscwheresno='1111'
-------------------------------------------------------------------------
触发器
前面学过:
学某个学生只能为男或女,可以用check(ssex=’男’orssex=‘女’)——在一个表中可以实现
约束在多个表中应该如何实现?
场景:
增加学生的信息之后,相应系部的人数也增加
1、什么叫触发器?
(理解)
触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由个事件来自动触发,比如当对一个表进行操作(insert/delete/update)时就会激活它执行。
2、语法格式(了解)
触发器格式:
CREATETRIGGER
ON
[WITHENCRYPTION|EXECUTEAS
{FOR|AFTER}
{[INSERT][,][UPDATE]>[,]<[DELETE]}
[WITHAPPEND]
[NOTFORREPLICATION]
AS
<
3、实例:
例1(掌握)
增加学生的信息之后,相应系部的人数也增加
执行该程序之前,先建立department表(deptnamevarchar(20),totalNumberint),然后汇总学生表中每个系的学生的人数,并存放到该表中
insertintodepartmentselectsdept,count(*)fromstudentgroupbysdept
--------------------------------
createtriggerafter_s
onstudent
afterinsert
as
begin
declare@sdeptvarchar(20)
select@sdept=sdeptfrominserted
updatedepartmentsettotalNumber=totalNumber+1wheredeptname=@sdept
end
测试结果:
select*fromdepartment
insertintostudent(sno,sdept)values('91112','cs')
select*fromdepartment--(结果发现cs部门人数多1)
4、作用:
(理解)
通常用于保证业务规则和数据完整性,其主要优点是让用户可以用编程的方法来实现复杂的处理逻辑和业务规则
1)触发器是自动的:
它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。
2)触发器完成比check约束更复杂的数据约束。
触发器可以引用其它表中的列。
例如,。
。
。
3)触发器实现复杂的业务规则,例如:
在库存系系统中,更新触发器可以检测什么时候库存下降到了需要进货的量,并自动生成给供货商的订单。
4)为保证数据库性能而维护的非规范化数据。
比如,为提高数据库的统计效率,每当在表中插入数据时,都使用触发器来统计某列的总值。
实例见后面(每当插入一条教师的数据,相应的部门的职工总数就加1).
5、触发器分类:
第一类:
DML触发器:
主要为insert/delete/update开头的语句创建触发器,触发对象——当前数据表或视图
1)After/for后触发器:
在insert/delete/update操作完成之后,执行触发器
2)Insteadof前触发器:
不执行insert/delete/update操作,而是执行触发器
第二类:
DDL触发器:
主要为create/alter/drop开头的语句创建触发器,可用于管理任务。
触发对象——当前数据库或服务器触发(sql2005新特点)(略)
DDL触发器格式:
CREATETRIGGER
ON{ALLSERVER|DATABASE}
[WITH
{FOR|AFTER}{event_type|event_group}[,...n]
AS
{sql_statement[;][...n]|EXTERNALNAME
:
=
[ENCRYPTION]
[EXECUTEASClause]
:
=
assembly_name.class_name.method_name
6、创建触发器
1)后触发器after/for:
(重点)
例1:
insert类触发器(见上面)
知识点:
DML触发器有两个特殊的表:
都是逻辑表,没有修改的权限,与对应的数据表结构一样
1)inserted表:
存放的是要插入的数据
2)delete表:
存入的是被删除的旧记录
after触发器工作流程:
在sqlserver接收到执行sql语句请求之后,先建立临时的inserted/deleted表,并存放sql语句的数据,最后才激活触发器。
----------------
createtriggerP_inst
onsc--在...表中
afterinsert--执行插入/修改/删除
as
declare@snochar(10)
select@snofrominserted--插入的信息放在inserted表
insertintostudent(sno)values(@sno)
-----------
测试:
insertintosc(sno,cno,grade)values('99999','2',90)
select*fromstudentwheresno='99999'
select*fromscwheresno='99999'
为什么执行结果与预期的不一致?
?
?
例2:
delete类触发器
删除学生的信息之后,相应的选课信息也应删除
createtriggerd_sc
onstudent
afterdelete--删除的记录存放在deleted表中
as
begin
declare@snochar(10)
select@sno=snofromdeleted–从deleted表中获取学号
deletefromscwheresno=@sno
end
测试
deletefromstudentwheresno='95007'
检证结果:
select*fromstudentwheresno='95007'
select*fromscwheresno='95007'
例3:
update类触发器
修改学生的信息后,发出'成功修改一个学生信息'
createtriggers_update
onstudent
afterupdate
as
begin
print'成功修改一个学生信息'
end
思考题:
修改学生表的学号,同时选课表中的学号也应修改
是否能正确执行?
如果不行,为什么?
分析:
要执行修改操作,必须是先删除后插入,即update=delete+insert
createtriggerupdate_s
onstudent
afterupdate—-接受更新操作,同时把删除的内容放入临时表deleted中,插入的内容放入临时表inserted中
as
begin
declare@Osnochar(10)
declare@Nsnochar(10)
select@Osno=snofromdeleted—-从deleted中获取已删除的学号
select@Nsno=snofrominserted—-从inserted中获取新增加的学号
updatescsetsno=@Nsnowheresno=@Osno
end
--测试:
updatestudentsetsno='55000'wheresno='95000'
select*fromstudent
select*fromsc
2)前触发器insteadof:
(理解)
格式:
CREATETRIGGER
ON[
[WITHENCRYPTION|EXECUTEAS
{INSTEADOF}
{[INSERT][,][UPDATE]>[,]<[DELETE]}
[WITHAPPEND]
[NOTFORREPLICATION]
AS
<
例4:
在插入学生的选课记录时,先添加该学生的信息。
createtriggercheck_sc
onsc
insteadofinsert
as
begin
declare@snochar(10)
select@sno=snofrominserted
insertintostudent(sno)values(@sno)
end
测试:
insertintosc(sno,cno,grade)values('95089','9',90)
select*fromstudent
思考题:
在插入学生的选课记录时,先检查学生的信息是否存在,如存在,提示已存在;否则,进行添加该学生信息?
7、应用实例(了解)
createtriggertot_tri
onEmployees
afterinsert
as
begin
updatedepartmentssettotalNumber=totalNumber+1
wheredeptNOin(selectdeptnofrominserted)
end
我并没有浪费我的时间
美国当代最伟大的推销员吉拉德,本来是一家报杜的职员,却为自己赢得了“世界上最伟大的推销员”的雃号。
他刚到报社当广告业务员时,对自己很有信心,因此他给经理提出不要薪水,只按广告费抽取佣金。
经理答应了他的请求。
办公室里的每一个人都认为他一定会失败。
他拟出一份名单,列出他打算前去拜访的客户类别。
在去之前,取出这12位客户的名单,把它念上一百遍,一面对自己说:
在本月之前,你们将向我购买广告版面。
”
结果到了那个月的月底,他和名单上的11个客户达成了交易,只剩下一位还不买他的广告。
在第二个月里,他未卖出任何广告,因为他除了去继续拜访这位坚决不登他广告的客户之外,并未去拜访任何新客户。
每一天早晨,当这位商人说“不”时,吉拉德就假装并未听到,而是继续前去拜访。
到了那个月的最后一天,对这位努力不懈的年轻人连续说了30天“不”的这位商人说话了,他说:
“年轻人,你已经浪费了一个月的时间来请求我买你的广告,我想知道这到底是为什么?
”
吉拉德回答说:
“我并没有浪费我的时间,我等于是在上学,而你一直就是我的老师。
我一直在训练自信心。
”
这位商人说:
“年轻人,我也要向你承认,我也等于是在上学,你已教了我坚持到底的一课,这比金钱更有价值,为了表示对你的感谢,我要向你订购一个广告版面,当作是我付给你的学费。
”
营销鸡汤:
推销就是初次遭到顾客拒绝之后的坚持不懈。
连续几十次、几百次地遭到拒绝,还是要坚持继续拜访。
如果不再去的的话,顾客将无法改变原来的决定而采纳你的意见,也就失去了销售机会。
面对拒绝也坚持不懈,抱着强大的信心去做,世界上有许多所谓“不可能”的事都有“可能”发生。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 触发器